Java 日历显示不正确 HOUR_OF_DAY
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());
我希望它能输出
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 return 是一样的,但是 calendar.getTime() 显示正确的 HOUR_OF_DAY。他们都在使用 NZST。
They are both using 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/Auckland”。
tl;博士
ZonedDateTime
.now(
ZoneId.of( "Pacific/Auckland" )
)
.getHour()
详情
是正确的。此外,您使用的可怕 classes 多年前被 JSR 310 中定义的 java.time classes 取代。
ZoneId
class in java.time replaces the legacy class TimeZone
。这个 class 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.
我在 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());
我希望它能输出
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 return 是一样的,但是 calendar.getTime() 显示正确的 HOUR_OF_DAY。他们都在使用 NZST。
They are both using 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/Auckland”。
tl;博士
ZonedDateTime
.now(
ZoneId.of( "Pacific/Auckland" )
)
.getHour()
详情
ZoneId
class in java.time replaces the legacy class TimeZone
。这个 class 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.