我的时区是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.
| 归档时间: |
|
| 查看次数: |
1520 次 |
| 最近记录: |