TimeZone casablanca的错误偏移量(java)

时间:2015-01-13 14:59:59

标签: java timezone

我正在尝试在卡萨布兰卡时区建立一个约会(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抛出异常。

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

谢谢!

2 个答案:

答案 0 :(得分:4)

使用最新的时区数据始终始终更新。要保持最新状态,您必须使用TZUpdater实用程序。 Oracle为JRE和TZUpdater发布the list of time zone updates。它显示了最后一次JRE更新(在我写这篇文章时)是针对Java 7的第65版,以及针对Java 8的第11版 - 它是使用版本2014c的tzdata制作的。

如果我们看一下the sources for tzdata at version 2014c,我们可以看到摩洛哥当时的猜测确实猜到了6月29日至7月29日的斋月DST停赛。

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

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

您可以看到原始猜测here中的一些面包屑,并且在tz列表档案中有很多关于埃及的讨论,starting in May并持续到7月。

答案 1 :(得分:2)

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