我正在尝试在卡萨布兰卡时区建立一个约会(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抛出异常。
据我所知,在那个特定时间没有发生夏令时变化。有什么想法吗?
谢谢!
答案 0 :(得分:4)
使用最新的时区数据
如果我们看一下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