[英]Java Calendar isn't showing correct HOUR_OF_DAY
我在 java 中使用日历 class 并且遇到了问题。 我有这个代码
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());
我希望它是 output
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。
他们都使用NZST。
不,他们不是,虽然我明白你为什么认为他们是。
第一个实际上是使用 UTC,因为“NZST”不是有效的时区 ID。 遗憾的是TimeZone.getTimeZone
在您提供无效 ID 时不会引发异常,但现在无法更改:(
calendar.getTime()
返回一个Date
引用,并且Date
没有时区,因此它在您的系统本地时区打印 - 这恰好是新西兰。
如果您将第一行代码更改为使用实时时区 ID,它的行为与您预期的一样:
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Pacific/Auckland"));
一些缩写(如 NZST)在Java中被识别为时区 ID,但最好使用完整的IANA 时区ID,如“太平洋/奥克兰”。
ZonedDateTime
.now(
ZoneId.of( "Pacific/Auckland" )
)
.getHour()
Jon Skeet 的答案是正确的。 此外,您正在使用多年前被 JSR 310 中定义的java.time类取代的糟糕类。
ZoneId
中的ZoneId class替换了旧版class TimeZone
。 这个 class ZoneId
实现了 Jon Skeet 回答中的愿望:如果你给它提供一个像NZST
这样的错误区域 ID,它会引发异常。
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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.