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
答案 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);