【发布时间】:2015-11-01 05:43:59
【问题描述】:
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 个?可能是因为夏令时吗?如果是这样,它不会自动处理它吗?
我不确定问题是否与夏令时有关。以下显示,我猜,两个时区都有 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
【问题讨论】:
-
这篇文章可能会有所帮助:stackoverflow.com/questions/13611108/…
-
你能试试下面提到的代码,让我知道 TimeZone zone = TimeZone.getTimeZone("America/New_York"); DateFormat 格式 = DateFormat.getDateTimeInstance(); format.setTimeZone(zone); System.out.println(format.format(new Date()));
标签: java