Joda DateTime的异常结果为01.04.1893

Str*_*kop 5 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
Run Code Online (Sandbox Code Playgroud)

时区的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
Run Code Online (Sandbox Code Playgroud)

只是转换为Date将部分偏移移动到分钟和秒.

Jon*_*eet 10

如果您没有指定时区,遗憾的是Joda Time使用系统时区.没错,柏林真的没有改变当时(和6分32秒).所以你要指定一个不存在的本地时间.

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

我同意使用系统默认时区是Joda的一个不好的举动(我们在Noda Time中修复了一个),但所有其余的行为都是绝对正常的.(Noda Time对于这种情况有一个特殊的例外,以区别于传递更明显不好的值,但我们去了.)

如果您根本不想让时区进入,那么您应该使用LocalDateTime.

  • IOW:这不是一个bug,它是一个功能.从字面上看. (5认同)