【问题标题】:Invalid ZoneDateTime parsing in Java / Scala [duplicate]Java / Scala中无效的ZoneDateTime解析[重复]
【发布时间】:2020-04-17 07:49:58
【问题描述】:

我正在尝试将日期从字符串解析为ZonedDateTimes,但遇到了一个奇怪的问题。

2020-11-01T01:00-05:00[America/New_York]

这是今年 EDT 结束后的一个小时。当我将它传递给ZonedDateTime.parse 时,我得到了

ZonedDateTime.parse("2020-11-01T01:00-05:00[America/New_York]")
// 2020-11-01T01:00-04:00[America/New_York]

如果我这样做了

ZonedDateTime.parse("2020-11-01T01:00-04:00[America/New_York]").plusHours(1)

我明白了

2020-11-01T01:00-05:00[America/New_York]

所以并不是说 Java 不能代表这个模棱两可的值什么的..

谁能向我解释这种行为和可能的解决方案?

注意:我使用的是 Java 8

【问题讨论】:

  • 抱歉,我无法重现此内容。如果我这样做 System.out.println(ZonedDateTime.parse("2020-11-01T01:00-05:00[America/New_York]")); 我会得到 2020-11-01T01:00-05:00[America/New_York]。你用的是什么java版本?
  • @AmirSchnell 我可以在 Java 8 上重现。
  • @Sweeper 我使用的是 Java 11,所以这可能是 JDK 问题
  • @AmirSchnell 是的,我也在使用 Java8
  • 我认为这与link有关

标签: java scala


【解决方案1】:

正如 Amir Schnell 在 cmets 中所说,这似乎是 JDK 中的 bug,因为他们无法在 Java 11 中重现它。

目前,我已经找到了这个解决方法:

将字符串解析为本地日期时间、区域 ID 和区域偏移量,并使用这三件事创建 ZonedDateTime

TemporalAccessor ta = DateTimeFormatter.ISO_ZONED_DATE_TIME.parse("2020-11-01T01:00-05:00[America/New_York]");
System.out.println(
    ZonedDateTime.ofLocal(
        LocalDateTime.from(ta), 
        ZoneId.from(ta), 
        ZoneOffset.from(ta)
    )
);

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 2020-05-23
    • 2017-09-07
    • 2012-04-09
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多