我的时区是 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/