public static long parseNormalDateTimeString(final String date) {
        if (date == null) {
            throw new IllegalArgumentException("Unable to parse null date");
        }

        try {
            // Our format requires a zone offset, e.g. 'Z', '+02', '+00:00', '-02:00', etc.
            final ZonedDateTime zonedDateTime = ZonedDateTime.parse(date, DEFAULT_ISO_PARSER);
            return zonedDateTime.toInstant().toEpochMilli();
        } catch (DateTimeParseException e) {
            throw new IllegalArgumentException("Unable to parse date: \"" + date + "\": " + e.getMessage(), e);
        }
    }
Parse a 'normal' type date in ISO 8601 format with a zone offset and a variable and optional
number of fractional second digits (0-9).
<p>
For example:
<pre>{@code
"2010-01-01T23:59:59Z" // No millis
"2010-01-01T23:59:59.123Z" // Millis
"2010-01-01T23:59:59.123456Z" // Nanos
"2010-01-01T23:59:59.123+00:00" // Zulu/UTC
"2010-01-01T23:59:59.123+02" // +2hr zone offset
"2010-01-01T23:59:59+0200" // +2hr zone offset
"2010-01-01T23:59:59+02:00" // +2hr zone offset
"2010-01-01T23:59:59+02:30" // +2hr30min zone offset
"2010-01-01T23:59:59.123-03:00" // -3hr zone offset
}</pre>

@param date string date
@return date as milliseconds since epoch
@throws IllegalArgumentException if date does not parse
stroom-query/stroom-query-language/src/main/java/stroom/query/language/functions/DateUtil.java