【发布时间】:2017-06-02 14:24:18
【问题描述】:
在使用 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
【问题讨论】:
-
是的,我刚刚也尝试过使用这样的示例,它在我的计算机上运行。整个画面有点复杂。我正在创建一个axis2消息构建器,它正在使用apache POI读取一个excel文件。日期是单元格的内容。也许这个问题与此更相关,但我仍然不明白为什么
-
我看不出有什么问题。仅供参考,您可以使用
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris"));在 ideone 中设置时区,就像我更新的测试一样。 -
感谢您的提示,使用它您现在可以看到问题:ideone.com/kaHaAz
-
真的是 1889 年还是 1899 年(因为 Excel 似乎使用 1899-12-30 作为纪元)?你如何得到你的
Date-instance?通过哪个 API?
标签: java excel date time format