简体   繁体   中英

Old Date Formatting incompatible with Java 8 ZonedDateTime API

I am updating my old date formatting code to Java 8 and trying the ZonedDateTime API .

The format of date is same as the Javascript Date object format, eg -

Thu May 25 2017 10:00:00 GMT+1200 (New Zealand Standard Time)

I was using the below format previously -

EEE MMM dd yyyy hh:mm:ss 'GMT'Z '('zzzz')'

This format fails to parse the date string using DateTimeFormatter.ofPattern method.

Here's the code:

public static final String DATE_FORMAT = "EEE MMM dd yyyy hh:mm:ss 'GMT'Z '('zzzz')'";

public static void main(String[] args) throws ParseException {
    String sDate = "Thu May 25 2017 10:00:00 GMT+1200 (New Zealand Standard Time)";
    parseDate(sDate);
}

private static void parseDate(String sDate) throws ParseException {

    // works
    DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
    Date oldDate = dateFormat.parse(sDate);

    //FIXME: can't parse?!
    ZonedDateTime newDate = ZonedDateTime.parse(
           sDate, DateTimeFormatter.ofPattern(DATE_FORMAT)); // <- this is the line 25!
}

Here's my full code for reference that can be compiled and run - https://gist.github.com/bhabanism/470e03db54981ad6ddedbba316dcaa9a

This fails at line#25 with:

Exception in thread "main" java.time.format.DateTimeParseException: Text 'Thu May 25 2017 10:00:00 GMT+1200 (New Zealand Standard Time)' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {HourOfAmPm=10, MilliOfSecond=0, MinuteOfHour=0, OffsetSeconds=43200, MicroOfSecond=0, NanoOfSecond=0, SecondOfMinute=0},ISO,Pacific/Auckland resolved to 2017-05-25 of type java.time.format.Parsed

Note, I can't change the input format of the Date, it has to be

Thu May 25 2017 10:00:00 GMT+1200 (New Zealand Standard Time)

I can surely modify the formatter

EEE MMM dd yyyy hh:mm:ss 'GMT'Z '('zzzz')'

It seems there was a bug in your format string all the time. Lowercase hh is for hour within AM or PM, in the range 1 through 12. Since you don't have AM/PM in your string, I suspect this was never what you wanted, and I wonder how the error went unnoticed.

Uppercase HH is for hour of day, 0 through 23:

public static final String DATE_FORMAT = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z '('zzzz')'";

With this change both the old and the new way of parsing works on my computer.

When adding Locale.ENGLISH to both formatters, that is. You may want to do the same.

The results I get are

Thu May 25 00:00:00 CEST 2017
2017-05-25T10:00+12:00[Pacific/Auckland]

Since CEST is 2 hours ahead of UTC, this is the same point in time, only rendered differently.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM