【问题标题】:Java Calendar isn't showing correct HOUR_OF_DAYJava 日历未显示正确的 HOUR_OF_DAY
【发布时间】:2020-11-28 09:49:14
【问题描述】:

我在 java 中使用 Calendar 类并且遇到了麻烦。我有这个代码

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("NZST"));
System.out.println("Calendar.HOUR_OF_DAY = " + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("Calendar.HOUR = " + calendar.get(Calendar.HOUR));
System.out.println("calendar.getTime() = " + calendar.getTime());

我希望它能够输出

Calendar.HOUR_OF_DAY = 17
Calendar.HOUR = 5
calendar.getTime() = Sat Aug 08 17:45:53 NZST 2020

而是输出

Calendar.HOUR_OF_DAY = 5
Calendar.HOUR = 5
calendar.getTime() = Sat Aug 08 17:45:53 NZST 2020

那么为什么 HOUR_OF_DAY 和 HOUR 返回相同的东西,但是 calendar.getTime() 显示了正确的 HOUR_OF_DAY。他们都在使用 NZST。

【问题讨论】:

标签: java calendar java.util.calendar java-calendar


【解决方案1】:

他们都在使用 NZST。

不,他们不是,虽然我明白你为什么认为他们是。

第一个是实际上使用 UTC,因为“NZST”不是有效的时区 ID。很遗憾,TimeZone.getTimeZone 在您向其提供无效 ID 时不会引发异常,但现在无法更改:(

calendar.getTime() 正在返回 Date 引用和 Date doesn't have a time zone,因此它在您的系统本地时区打印 - 恰好是新西兰。

如果您将第一行代码更改为使用 真实 时区 ID,它的行为将与您预期的一样:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Pacific/Auckland"));

几个缩写(如 NZST)在 Java 中被识别为时区 ID,但总是最好使用完整的 IANA time zone ID,如“Pacific/奥克兰”。

【讨论】:

    【解决方案2】:

    tl;博士

    ZonedDateTime
    .now( 
        ZoneId.of( "Pacific/Auckland" ) 
    ) 
    .getHour()
    

    详情

    Answer by Jon Skeet 是正确的。此外,您使用的糟糕的类在几年前被 JSR 310 中定义的 java.time 类所取代。

    java.time 中的ZoneId 类替换了legacyTimeZone。此类 ZoneId 实现了 Jon Skeet 回答中的愿望:如果您向其提供错误的区域 ID,例如 NZST,它会引发异常。

    java.time

    ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;  // Specify a time zone. A history of past, present, and future changes to the offset-from-UTC used by the people of a particular region. 
    ZonedDateTime zdt = ZonedDateTime.now( z ) ;  // Capture the current time as seen in a particular time zone.
    int hour = zdt.getHour() ;                    // Extract the hour of he day.
    

    【讨论】:

      猜你喜欢
      • 2016-10-16
      • 2014-12-20
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 2016-11-06
      相关资源
      最近更新 更多