Java日历中的错误时刻

时间:2015-11-01 05:43:59

标签: java

TimeZone zone1 = TimeZone.getTimeZone("America/New_York");
TimeZone zone2 = TimeZone.getTimeZone("Europe/Istanbul");
int hour1 = Calendar.getInstance(zone1).get(Calendar.HOUR_OF_DAY);
int hour2 = Calendar.getInstance(zone2).get(Calendar.HOUR_OF_DAY);

// hour1 gives 1
// hour2 gives 7

现在在纽约是1,在伊斯坦布尔是8。为什么Java为欧洲/伊斯坦布尔减少了1个结果?可以因为夏令时吗?如果是这样,它是不是会自动处理它?<​​/ p>

我不确定问题是否是因为夏令时的事情。以下显示,我猜两个时区都有DST偏移:

zone1.getDSTSavings()/1000L   // gives 3600
zone2.getDSTSavings()/1000L   // gives 3600

zone1.useDaylightTime()   // true
zone2.useDaylightTime()   // true

zone1.inDaylightTime(new Date())   // false
zone2.inDaylightTime(new Date())   // false

解决:

时区数据不是最新的。从Java网站下载tzupdater实用程序,然后发出:

java -jar tzupdater.jar -l 'http://www.iana.org/time-zones/repository/tzdata-latest.tar.gz'

此自动下载最新的tz数据并更新JRE。这是一个地狱。因愚蠢的时区问题而失去2天。这应该是自动化的,JRE应该每天自我更新。为什么不呢???

插入新的crontab条目:(又一个)

crontab -e
00 05 * * * java -jar tzupdater.jar -l https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz

2 个答案:

答案 0 :(得分:7)

土耳其时间似乎存在问题,因为火鸡已经改变了DST 1 Nov to 8 Nov

因为对于未更新的JVM,如果我这样做

TimeZone timeZone = TimeZone.getTimeZone("Europe/Istanbul");
System.out.println(timeZone.inDaylightTime(new Date()))

它给了我假,但至于伊斯坦布尔,DST到8月8日。

因此,您需要从here更新JVM tzdata版本。这是最新的tzdata数据版本也说的。

  

tzdata2015g不适用土耳其2015年的后退过渡计划   11月8日,而不是10月25日。诺福克在2015-10-04从+1130上升到+1100   当地时间02:00斐济2016年的倒退过渡计划   1月17日,不是24.不列颠哥伦比亚省纳尔逊堡不会倒下   回到2015-11-01。它实际上已经在MST(-0700)上了   在2015-03-08推出其时钟。美国新区/ Fort_Nelson。

请参阅此tzupdater documents以获取JVM的更新

答案 1 :(得分:2)

此代码是正确的。我的结果纽约1 - 伊斯坦布尔9。 此问题是您的计算机或操作系统。我住在伊斯坦布尔和第9天的小时。 夏令时申请还没有结束。因为土耳其选举被推迟了2周。

    TimeZone zone1 = TimeZone.getTimeZone("America/New_York");
    TimeZone zone2 = TimeZone.getTimeZone("Europe/Istanbul");
    int hour1 = Calendar.getInstance(zone1).get(Calendar.HOUR_OF_DAY);
    int hour2 = Calendar.getInstance(zone2).get(Calendar.HOUR_OF_DAY);

    System.out.println("New York" + hour1 + " - Istanbul "+ hour2);