java - Joda DateTime 中 01.04.1893 的奇数结果

标签 java jodatime

我的时区是 CET(柏林)。
在测试 Joda 的 DateTime 时,我注意到了一些奇怪的事情:

new DateTime(1893, 4, 1, 0, 0, 0, 0);
=>  java.lang.IllegalArgumentException: Illegal instant due to time zone offset transition: 

new DateTime(1893, 3, 31, 0, 0, 0, 0).toDate();
=>  Fri Mar 31 00:06:32 CET 1893

时区偏移 6 分 32 秒导致时间不存在?
我必须说这是非常出乎意料的,因为我没有指定任何时区信息,因此没想到会遇到这种问题。
如果 1893 年 3 月的 CET(柏林)不存在 - 为什么 new DateTime(1893, 3, 31, 0, 0, 0, 0) 选择与时间匹配的时区我指定了(即 0 分 0 秒)?

使用 DateTime 获取正确时间的选项有哪些?

-- 编辑--
问题似乎是 toDate()。在发布问题之前我已经将其编辑掉了。
Joda 本身实际上工作正常:

new DateTime(1893, 3, 31, 0, 0, 0, 0);
=>  1893-01-01T00:00:00.000+00:53:28

只是在转换为Date时将部分偏移移到了分秒上。

最佳答案

如果您不指定时区,很遗憾,Joda Time 使用的是系统时区。是的,柏林 really did change那时(还有 6 分 32 秒)。所以你指定了一个不存在的本地时间。

“为什么不 [...] 选择与我指定的时间匹配的时区?”是什么意思? - 时区会影响本地时间映射到 UTC 的方式。在您隐式指定的时区(通过让它选择您的系统默认值),该时间不存在;没有 UTC 即时映射到那个本地时间。有任意数量的时区可以映射本地时间 - Joda 如何知道选择哪个时区?

我同意使用系统默认时区对 Joda 来说是一个糟糕的举动(我们在 Noda Time 中修复了这一点)但所有其他行为绝对没问题。 (Noda Time 对这种情况有一个特定的异常(exception),以将其与传递更明显不好的值区分开来,但我们走了。)

如果您根本不希望加入时区,那么您应该改用LocalDateTime

关于java - Joda DateTime 中 01.04.1893 的奇数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2420527/

相关文章:

java - 带有 Joda-Time DateTimeFormatter 的属格(波兰语语言环境)月份名称

java - 为什么 withWeekOfWeekyear 给我不同的偏移量?

java - Android BLE 无法正确连接到设备

java - Recycler查看项目点击键

java - Joda Time - 获取一年中的所有星期

java - Spring mongo 和 Joda DateTime

java - 一般错误 :class is not applicable for the arguments

java - 在整个 Tomcat 运行时保存一个变量

java - 平滑运动java

java - 日期时间转换为日期时显示不同的日期