【问题标题】:Java OffsetDateTime returning wrong offsetJava OffsetDateTime 返回错误的偏移量
【发布时间】:2021-08-31 08:45:35
【问题描述】:

我有一个 Java 时间戳值,例如:1799-12-31 19:03:58.0 当我尝试使用代码将其转换为 OffsetDateTime 时:

timestamp.toLocalDateTime().atZone(ZoneId.systemDefault()).toOffsetDateTime();

它给我的输出是:

1799-12-31T19:03:58+05:53:28

在前端(Angular 的日期管道)没有解析。 但是相同的代码返回时间戳的不同偏移量:2019-08-24 10:15:22.0 as:

2019-08-24T10:15:22+05:30

哪个是有效的,并且被 Angular 的日期管道成功解析。

我不明白为什么它在“1799-12-31 19:03:58.0”日期返回不同的偏移量。

【问题讨论】:

  • The output is technically correct. 您有想要的输出吗?您的前端实际上期望什么?您正在为前端提供服务器的系统时区。这看起来不对……前端应该关心服务器的系统时区吗?如果没有,您可以使用Instant
  • 另见this,我在其中列出了 tzdb 中记录的从 1700 到 2000 的所有时区变化。

标签: java offsetdatetime


【解决方案1】:

简答:历史

从奇怪的 05:53:28 偏移量来看,您当前的时区是 Asia/Calcutta ← 好吧,这个时区已重命名为 Asia/Kolkata

Back in 1799,每个城市都有自己的当地时间,这就是为什么这个偏移量很奇怪。由于政治决定,时区经常会发生变化,Java 从每个 Java 版本随附的时区数据中获取这些数据。

所以那些不同的偏移量实际上是正确的。

如果您的前端无法解析这个奇怪的偏移量,那么您需要修复您的前端。


更多信息和类似观察:

【讨论】:

    【解决方案2】:

    我的猜测是您在亚洲/加尔各答时区 - 根据IANA time zone data,在 1854 年之前确实有 +05:53:28 的偏移量,并且没有稳定到 + 05:30:00 直到 1905 年。所以在 1799 年,偏移量应该(根据 IANA 数据)为 +05:53:28。

    换句话说,问题出在您的期望中,而不是在 Java 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 2020-04-13
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      相关资源
      最近更新 更多