Java日历中的错误时间

Java日历中的错误时间,java,Java,现在在纽约是1,但在伊斯坦布尔是8。为什么Java给欧洲/伊斯坦布尔的结果少了1个?是不是因为夏令时?如果是这样的话,它不是自动处理吗 我不确定问题是否是因为夏令时的原因。我想,下面显示的两个时区都有DST偏移: TimeZone zone1 = TimeZone.getTimeZone("America/New_York"); TimeZone zone2 = TimeZone.getTimeZone("Europe/Istanbul"); int hour1 = Calendar.getIn

现在在纽约是1,但在伊斯坦布尔是8。为什么Java给欧洲/伊斯坦布尔的结果少了1个?是不是因为夏令时?如果是这样的话,它不是自动处理吗

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

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
已解决:

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

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
这将自动下载最新的tz数据并更新JRE。这是地狱。因为一个愚蠢的时区问题损失了2天。这应该是自动化的,JRE应该每天自我更新。为什么不呢

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


这个代码是正确的。我的结果是纽约1-9。 此问题与您的计算机或操作系统有关。我住在伊斯坦布尔,每天9点。 夏季申请尚未结束。因为土耳其选举推迟了两周

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

土耳其时间似乎有问题,因为土耳其从DST改为DST

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

    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);
这给了我错误的答案,但伊斯坦布尔的DST是11月8日

因此,您需要从更新JVM
tzdata
版本。以下是最新的tzdata数据版本的说明

tzdata2015g不适用土耳其2015年的回退过渡计划 11月8日,而不是10月25日。2015年10月4日,诺福克从+1130移动到+1100 当地时间02:00。斐济2016年的倒退过渡计划已定 1月17日,而不是24日。不列颠哥伦比亚省纳尔逊堡不会倒塌 回到2015年11月1日。自发布以来,它实际上一直在MST(-0700)上 在2015年3月8日提前了时钟。美洲新区/尼尔森堡


因此,请参阅此tzupdater以获取JVM的更新。这篇文章可能会有所帮助:您可以尝试下面提到的代码并让我知道TimeZone=TimeZone.getTimeZone(“美国/纽约”);DateFormat=DateFormat.getDateTimeInstance();格式。设置时区(zone);System.out.println(format.format(new Date());
    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);
TimeZone timeZone = TimeZone.getTimeZone("Europe/Istanbul");
System.out.println(timeZone.inDaylightTime(new Date()))