5

我的时区是 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 将部分偏移量移动到分钟和秒中。

4

2 回答 2

10

如果您不指定时区,不幸的是 Joda Time 使用系统时区。是的,当时柏林确实发生了变化(而且变化了 6 分 32 秒)。所以你指定了一个不存在的当地时间。

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

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

如果您根本不希望时区进入它那么您应该使用 aLocalDateTime代替。

于 2010-03-10T21:08:03.320 回答
0

您是否尝试使用 实例化该项目new DateTime(1893, 4, 1, 0, 0, 0, 0, DateTimeZone.UTC);

于 2010-03-10T21:09:06.460 回答