我正在将旧的日期格式化代码更新为 Java 8 并尝试使用 ZonedDateTime API。
日期的格式与Javascript Date对象格式相同,例如-
Thu May 25 2017 10:00:00 GMT+1200 (New Zealand Standard Time)
我之前使用过以下格式 -
EEE MMM dd yyyy hh:mm:ss 'GMT'Z '('zzzz')'
此格式无法使用 DateTimeFormatter.ofPattern 方法解析日期字符串。
代码如下:
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!
}
这是我的完整代码供引用,可以编译和运行 - https://gist.github.com/bhabanism/470e03db54981ad6ddedbba316dcaa9a
这在第 25 行失败:
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
注意,我无法更改日期的输入格式,它必须是
Thu May 25 2017 10:00:00 GMT+1200 (New Zealand Standard Time)
我肯定可以修改格式化程序
EEE MMM dd yyyy hh:mm:ss 'GMT'Z '('zzzz')'
最佳答案
您的格式字符串似乎一直存在错误。小写 hh
表示 AM 或 PM 内的小时,范围为 1 到 12。由于您的字符串中没有 AM/PM,我怀疑这从来都不是您想要的,我想知道如何该错误未被注意到。
大写的 HH
表示一天中的小时,从 0 到 23:
public static final String DATE_FORMAT = "EEE MMM dd yyyy HH:mm:ss 'GMT'Z '('zzzz')'";
通过此更改,旧的和新的解析方式都可以在我的计算机上运行。
将 Locale.ENGLISH
添加到两个格式化程序时,即。您可能也想这样做。
我得到的结果是
Thu May 25 00:00:00 CEST 2017
2017-05-25T10:00+12:00[Pacific/Auckland]
由于 CEST 比 UTC 早 2 小时,因此这是同一时间点,只是呈现方式不同。
关于java - 旧日期格式与 Java 8 ZonedDateTime API 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44087339/