gpt4 book ai didi

Java 8 LocalDateTime 和奇怪的区域行为

转载 作者:行者123 更新时间:2023-11-30 06:07:22 24 4
gpt4 key购买 nike

使用 Java8 中的 LocalDateTime 时我有点困惑。

我正在尝试做什么

  • 我有一个 Date (java.util) 对象
  • 我想将其转换为 LocalDateTime
  • 我想格式化 LocalDateTime 以获取 HH:mm 的时间

我做了什么

LocalDateTime ldate2 = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
LocalDateTime ldate = LocalDateTime.ofInstant(date.toInstant(), ZoneId.of("CET"));
System.out.println("Date : " + date);
System.out.println("LocalDateTime CET : " + ldate);
System.out.println("LocalDateTime " + ZoneId.systemDefault() + " : " + ldate2);

结果是

Date : Sun Dec 31 23:30:00 CET 1889
LocalDateTime CET : 1889-12-31T23:30
LocalDateTime Europe/Paris : 1889-12-31T22:39:21

我的问题

我期望的最终结果是 23:30 ,它与 ZoneId.of("CET") 配合得很好,但我想避免指定使用系统一 ZoneId.systemDefault() 的时区。在本例中为欧洲/巴黎。但后来我得到了22:39。我很容易理解 1 小时的偏移量,但这里对我来说听起来很奇怪。

SimpleDateFormat 与原始日期一起使用可以正常工作,但代码可能会在多线程环境中运行,因此我需要一个线程安全的解决方案。

有人可以向我解释一下这种行为吗?这是预期的还是我做错了什么(或者我不理解一些明显的事情:))?预先感谢您对我的帮助。

编辑:

该问题与相当古老的年份 (1889) 有关,但这是 Excel 中用于表示时间的年份。查看问题的代码示例:http://ideone.com/kaHaAz

最佳答案

我还没有找到这方面的来源,但看起来 1889 年巴黎的偏移量确实可能是 +00:09:21:

System.out.println(LocalDateTime.parse("1889-12-03T10:15:30").atZone(ZoneId.of("Europe/Paris")).getOffset());
// +00:09:21

另请参阅https://stackoverflow.com/a/7232851/1553851

关于Java 8 LocalDateTime 和奇怪的区域行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41715500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com