卡萨布兰卡时区(Java)的偏移量错误。

5
我正在尝试在卡萨布兰卡时区构建一个日期(2014年7月29日凌晨02:55:08),但出现了以下异常:
"main"线程中的异常,java.lang.IllegalArgumentException: HOUR_OF_DAY: 2->3 在java.util.GregorianCalendar.computeTime(Unknown Source)
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中不会。

据我所知,在那个特定的时间没有进行夏令时更改。有什么想法吗?

谢谢!

2个回答

5
JRE并非总是使用最新的时区数据。为保持最新,您必须使用TZUpdater实用程序。Oracle发布了适用于JRE和TZUpdater的时区更新列表。它显示截至我撰写本文时,Java 7的最后一个JRE更新版本为65,Java 8的最后一个JRE更新版本为11,并且是使用tzdata 2014c版本进行的更新。
如果我们查看tzdata版本2014c的源代码,我们可以看到当时对摩洛哥的猜测确实猜中了Ramadan DST自6月29日至7月29日的暂停。
Rule    Morocco 2014    only    -   Jun  29      3:00   0       -
Rule    Morocco 2014    only    -   Jul  29      2:00   1:00    S

当埃及最终宣布真正的日期时,这个值当然后来更新为Chris的答案中显示的值。
你可以在这里看到一些原始猜测的线索,还有许多有关埃及的讨论,从五月开始,一直持续到七月。

非常感谢。我之前不知道有 TZUpdater 工具,但它解决了我的问题。 - JDM
@JDM Matt的答案非常好,你应该点击投票按钮下面的大绿色对勾来标记这个答案为被采纳。 - C. K. Young

2

根据时区数据,2014年7月29日上午02:55:08应该是一个有效的时间戳?(Calendar.MONTH索引从0开始,因此6表示七月) - JDM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接