TimeZone casablanca 的偏移量错误 (java)

Wrong offset for TimeZone casablanca (java)

我正在尝试在卡萨布兰卡时区建立一个日期(2014 年 7 月 29 日 02:55:08 上午)并遇到此异常:

线程异常 "main" java.lang.IllegalArgumentException: HOUR_OF_DAY: 2 -> 3 在 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.

不会抛出异常

据我所知,那个特定时间没有发生夏令时变化。有什么想法吗?

谢谢!

它实际上确实对应于夏令时的变化。在摩洛哥,斋月期间暂停夏令时。有关详细信息,请参阅 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

JRE 并非总是使用最新的时区数据进行更新。要保持最新状态,您必须 使用 TZUpdater 实用程序。 Oracle 为 JRE 和 TZUpdater 发布 the list of time zone updates。它表明最后一次 JRE 更新(在我写这篇文章时)是 Java 7 的版本 65,Java 8 的版本 11 - 它是用 tzdata 的 2014c 版本制作的。

如果我们看the sources for tzdata at version 2014c,可以看出当时对摩洛哥的猜测确实猜到了6月29日-7月29日斋月夏令时暂停

Rule    Morocco 2014    only    -   Jun  29      3:00   0       -
Rule    Morocco 2014    only    -   Jul  29      2:00   1:00    S

当埃及最终宣布真实日期时,当然后来更新为克里斯的回答中显示的值。

您可以看到一些来自最初猜测 here and there are many discussions in the tz list archives about Egypt, starting in May 并一直持续到 7 月的面包屑。