使用 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
关于Java 8 LocalDateTime 和奇怪的区域行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41715500/