【问题标题】:Wrong hour of day in Java calendarJava日历中的错误时间
【发布时间】: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


【解决方案1】:

土耳其时间似乎有问题,因为土耳其的夏令时已从 1 Nov to 8 Nov

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

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

它给了我错误,但至于伊斯坦布尔,夏令时直到 11 月 8 日。

所以你需要从here 更新JVM tzdata 版本。这是最新的 tzdata 数据版本也说的。

tzdata2015g n/a 土耳其 2015 年的后备过渡计划于 11 月 8 日,而不是 10 月 25 日。诺福克在 2015 年 10 月 4 日从 +1130 变为 +1100 当地时间02:00。斐济 2016 年的后备过渡计划 1 月 17 日,而不是 24 日。不列颠哥伦比亚省纳尔逊堡不会倒下 回到 2015-11-01。自从它以来,它一直有效地在 MST (-0700) 在 2015-03-08 上推进了它的时钟。美国新区/Fort_Nelson。

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

【讨论】:

    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 2019-06-25
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多