public static ZoneId getTimeZone(final String timeZone) throws ParseException {
        ZoneId dateTimeZone;

        if (!NullSafe.isBlankString(timeZone)) {
            try {
                dateTimeZone = ZoneId.of(timeZone);
            } catch (final DateTimeException | IllegalArgumentException e) {
                throw new ParseException("Time Zone '" + timeZone + "' is not recognised", 0);
            }
        } else {
            dateTimeZone = ZoneOffset.UTC;
        }

        return dateTimeZone;
    }
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