Java 1893年4月1日Joda DateTime中的奇数结果
我的时区是CET(柏林)。Java 1893年4月1日Joda DateTime中的奇数结果,java,jodatime,Java,Jodatime,我的时区是CET(柏林)。 在测试乔达的约会时间时,我注意到一些奇怪的事情: 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 C
在测试乔达的约会时间时,我注意到一些奇怪的事情:
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(柏林)不存在-为什么不
新日期时间(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
只是转换为日期会将部分偏移量移动到分和秒中。如果不指定时区,不幸的是,Joda time使用的是系统时区。是的,当时的柏林(6分32秒)。所以您指定了一个不存在的本地时间 您所说的“为什么不[…]选择与我指定的时间相匹配的时区?”-时区会影响本地时间映射到UTC的方式。在您隐式指定的时区中(通过让它选择您的系统默认值),该时间不存在;没有UTC即时映射到该本地时间。有很多时区可以绘制当地时间-乔达怎么知道选择哪个时区 我同意使用系统默认时区对Joda来说是一个糟糕的举动(我们也在其中进行了修正),但所有其他行为都是绝对正确的。(野田佳彦在这种情况下有一个特殊的例外,以区分它传递的值更明显是不好的,但我们开始了。)
如果您根本不希望时区进入它,那么您应该使用
LocalDateTime
。您是否尝试使用新的DateTime(1893,4,1,0,0,0,0,DateTimeZone.UTC)实例化该项代码>?IOW:这不是一个bug,它是一个特性。字面意思。谢谢你的链接。我知道CET在那个日期之前是不存在的。我发现joda确实正确地创建了日期。我的问题似乎是转换为java.util.Date时无法很好地处理移位(请参见我的编辑)。但是,与日期时间相比,日期的问题可能更大。