java - 旧日期格式与 Java 8 ZonedDateTime API 不兼容

标签 java date datetime java-8

我正在将旧的日期格式化代码更新为 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/

相关文章:

Python date.today() 不返回本地日期

python - 如何将 float64 值转换为其等效的日期时间格式?

c# - 验证日期是否在 SqlDbType.DateTime 范围内

java - java中for循环内部的后台服务调用?

java - System.out 中的三元运算符

javascript - Chrome 和 Firefox 之间的时间戳转换差异

php - 计算一个月的工作天数

java - 创建实体和非实体对象之间的关系

java - 在Java中压缩/解压缩LZMA字符串

sql - 如何在 SQL 中搜索日期?