我正在尝试在卡萨布兰卡时区建立一个日期(29/07/2014 at 02:55:08 am),并得到这个异常:
线程"main"中的异常 java.lang.IllegalArgumentException: HOUR_OF_DAY: 2 -> 3 at java.util.GregorianCalendar.computeTime(未知来源)
Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("Africa/Casablanca"));
cal.setLenient(false);
cal.set(Calendar.DATE, 29);
cal.set(Calendar.MONTH, 6); // July
cal.set(Calendar.YEAR, 2014);
cal.set(Calendar.HOUR_OF_DAY, 2);
cal.set(Calendar.MINUTE, 55);
cal.set(Calendar.SECOND, 8);
cal.getTime();
在 jre 1.7.0_71 和 1.8.0_20 中抛出异常,但在 1.6.0_30 中不会抛出异常。
据我所知,在那个特定时间没有夏令时的变化发生。知道吗?
谢谢!
JRE 并不总是使用最新的时区数据进行更新。 要保持最新状态,您必须使用 TZUpdater 实用程序。 Oracle 发布了 JRE 和 TZUpdater 的时区更新列表。 它显示最后一个 JRE 更新(截至我撰写本文时)是在 Java 7 的第 65 版和 Java 8 的第 11 版中 - 它是使用 tzdata 的 2014c 版本制作的。
如果我们查看 2014c 版 tzdata 的来源,我们可以看到当时摩洛哥的猜测确实猜测了 6 月 29 日至 7 月 29 日的斋月夏令时暂停。
Rule Morocco 2014 only - Jun 29 3:00 0 -
Rule Morocco 2014 only - Jul 29 2:00 1:00 S
当然,后来它被更新为克里斯回答中显示的值,当时埃及终于宣布了真正的日期。
你可以在这里看到一些来自原始猜测的面包屑,在 tz 列表档案中有很多关于埃及的讨论,从 5 月开始一直持续到 7 月。
它实际上确实对应于夏令时的变化。在摩洛哥,斋月期间暂停夏令时。有关详细信息,请参阅 http://www.timeanddate.com/news/time/egypt-morocco-dst-ramadan-2014.html。
2014年的时区数据条目如下:
Rule Morocco 2014 only - Jun 28 3:00 0 -
Rule Morocco 2014 only - Aug 2 2:00 1:00 S