Java 8 LocalDateTime 和奇怪的区域行为

标签 java excel date time format

使用 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/

相关文章:

java - 井字游戏的开始菜单

vba - 使用vba取消合并并粘贴单元格

Excel VBA 更改单元格颜色

c# - Web 服务的日期格式问题

java - JDateChooser 显示语言

Java:仅替换文件中的一行/字符串

java - 如何在冒泡排序中修复java中的 'java.lang.ArrayOutOfBound exception'

java - 在我的应用程序创建的文件夹中驱动 API 自己的文件

excel - 基于多个条件的查找行号 - Excel

java - 使用 SimpleDateFormat 但小时值倒退 3 小时