Java OffsetDateTime 返回错误的偏移量
我有一个 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为:
2019-08-24T10:15:22+05:30
这是有效的并且成功地被 Angular 的日期管道解析。
我不明白为什么它为“1799-12-31 19:03:58.0”日期返回不同的偏移量。
回答
简短的回答:历史。
从奇怪的05:53:28偏移量来看,您当前的区域是?好吧,这个时区已重命名为Asia/CalcuttaAsia/Kolkata.
早在 1799 年,每个城市都有自己的当地时间,这就是为什么这种偏移很奇怪。时区经常因政治决策而改变,Java 从每个 Java 版本随附的时区数据中获取这些数据。
所以那些不同的偏移实际上是正确的。
如果您的前端无法解析这个奇怪的偏移量,那么您需要修复您的前端。
更多信息和类似观察:
- 为什么减去这两次(在 1927 年)会给出一个奇怪的结果?
- DateFormatter 为非常旧的日期提供了奇怪的时区
- 提供带有偏移量(+0530)的日期字符串与在显示名称中单独指定时区(亚洲/加尔各答)
- Java OffsetDateTime 返回错误的偏移量
我的猜测是你在亚洲/加尔各答时区 - 根据IANA 时区数据,在 1854 年之前确实有 +05:53:28 的偏移量,并且没有设置为 +05: 30:00 到 1905 年。所以在 1799 年,偏移量应该(按照 IANA 数据)是 +05:53:28。
换句话说,问题出在您的期望中,而不是在 Java 中。