2010-06-16 83 views
4

1942年4月3日有什么特别的东西吗?由于某些原因,第0天(上午12:00)的这个小时对于此特定日期是非法的。当使用宽松日历但日间时间增加到1(上午1:00)时,接受日期。为什么1942/4/3 00:00:00 java.util.Calendar中的非法日期?

相关代码

java.util.Calendar calendar = java.util.Calendar.getInstance(
    java.util.TimeZone.getTimeZone("Europe/Helsinki") 
); 
calendar.clear(); 
calendar.setLenient(false); 
calendar.set(1942, 3, 3, 0, 0, 0); 
calendar.getTimeInMillis(); 

异常

java.lang.IllegalArgumentException: HOUR_OF_DAY 
at java.util.GregorianCalendar.computeTime(Unknown Source) 
at java.util.Calendar.updateTime(Unknown Source) 
at java.util.Calendar.getTimeInMillis(Unknown Source) 

我真的是喜欢的日期并不宽松,因为我不想接受不可能的日期。

- 编辑

作为公认的答案和许多的评论指出,这确实涉及到夏令时。 1942年4月3日00:00夏令时在EEST /赫尔辛基时区进行了测试。目前,夏令时自1981年以来一直在使用,时钟在03:00而不是00:00进行。这意味着e..g 2010年3月28日03:00在java.util.Calendar中不存在。

我只需要在我的代码中为这个特定日期创建一个特例。

+0

适合我。当然是负值,因为它在时代之前。你确定你给我们的是你正在运行的?你是否尝试过运行那个例子? – 2010-06-16 13:14:56

+4

http://stackoverflow.com/questions/1586109/hours-corrupted-when-subtract-one-day-from-gregoriancalendar 是的,根据你的时区设置,你没有那个时间! – wtaniguchi 2010-06-16 13:15:58

+0

绝对看起来像一个与时区和夏令时相关的问题。 – 2010-06-16 13:21:22

回答

6

只是猜测,但它是否与夏令时有关?我想这将取决于您的代码库的本地化(夏令时生效的确切日期)以及其他因素。

---编辑---也许不是,因为那是一个星期五。

+2

是的,这是! http://stackoverflow.com/questions/1586109/hours-corrupted-when-subtract-one-day-from-gregoriancalendar正在谈论相同的日期。 – wtaniguchi 2010-06-16 13:16:40

+0

这是正确的。我会尽快接受答案。 – 2010-06-16 13:20:51

3

时区和夏令时每年都在变化,1942年在世界的大部分地区都是特别奇怪的 - 各个地区的转手都相当迅速。亚洲的一些地区被标准化为“缅甸时代”,因此从当地时代过渡。

你的个人资料说你在芬兰,这并不复杂。这个world-time database把有问题的日期和时间放在一个小时内,因为正常日光节约了。

+0

链接非常有趣,谢谢!我甚至都不知道芬兰在1981年之前有没有夏令时。 – 2010-06-16 13:41:05

+0

验证侦测工作+1(检查OP的配置文件) – Pops 2010-06-16 17:29:58

相关问题