【发布时间】:2011-03-04 11:13:06
【问题描述】:
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)
我真的希望日期不宽大,因为我不想接受不可能的日期。
--编辑
正如公认的答案和许多 cmets 指出的那样,这确实与夏令时有关。 1942 年 4 月 3 日 00:00 夏令时在 EEST/赫尔辛基时区进行了测试。目前,夏令时从 1981 年开始使用,时钟在 03:00 而不是 00:00 向前上弦。这意味着 java.util.Calendar 中不存在例如 2010 年 3 月 28 日 03:00。
我只需要在我的代码中为这个特定日期创建一个特殊情况。
【问题讨论】:
-
对我来说很好。当然是负值,因为它是在纪元之前。你确定你给我们的正是你正在运行的吗?您是否尝试过完全运行该示例?
-
stackoverflow.com/questions/1586109/… 是的,根据您的时区设置,您没有那个时间!
-
看起来肯定是与时区和夏令时有关的问题。
-
所以问题真的应该是“哪里是 1942/4/3 00:00:00 一个非法日期...”
-
不得不在其他日期面临类似的问题。那时我还没有被介绍给一个叫做夏令时的麻烦。 :)