为什么1942/4/3 00:00:00是java.util.Calendar中的非法日期?

时间:2010-06-16 13:10:22

标签: java calendar timezone

1942年4月3日有什么特别之处吗?出于某种原因,第0天(上午12:00)的小时在此特定日期是非法的。使用宽松日历但一天中的小时增加到1(凌晨1:00)时接受日期。

相关代码

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前进。这意味着java.util.Calendar中不存在e 2010年3月28日03:00。

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

你的个人资料说你在芬兰,这并不复杂。这个world-time database将日期和时间置于正常夏令时丢失的一小时内。