Java 时间:本地时间 (UTC) 到 ZonedTime (-05:00) 显示的时间不正确
Java Time: LocalTime (UTC) to ZonedTime (-05:00) not displaying correct hour
我刚开始使用 Java 的内置时间 API。我正在尝试以 UTC 格式获取当前时间,并且我希望能够将其转换为 运行 程序所在的时区。现在我有这个代码:
Clock clock = Clock.systemUTC();
LocalDateTime time = LocalDateTime.now(clock);
ZonedDateTime zonedTime = time.atZone(ZoneId.systemDefault());
System.out.println("UTC time: " + time + " Local: " + zonedTime);
然而,这打印出来:
UTC time: 2022-06-01T15:25:57.933673600 Local: 2022-06-01T15:25:57.9336736-05:00
它似乎正在获取正确的时区,但并未将其应用于输出。所以如果我打印
time.getHour()
zonedTime.getHour()
他们都打印出“15”。让它给我应用时区偏移的时间的正确方法是什么? UTC时间是15,而我的本地时间是10。我希望能够将UTC转换成时区时间。
原因是我正在设置保存文件 - 所以我想记录保存文件时的 UTC 时间,然后在用户检查时能够显示用户时区的时间他们计算机上的保存日期。
感谢您的宝贵时间!
问题出在您对 LocalDateTime
的使用上。它不知道它在哪个时区 - 所以当你使用 LocalDateTime.atZone
时,它假设你想保持相同的本地 date/time.
此处最好的解决方法是将 LocalDateTime.now(clock)
更改为 Instant.now(clock)
。您感兴趣的是“当前时刻”,而不是“UTC 当地时间”。
或者,在系统时区中使用 Clock
ZonedDateTime.now(clock)
。
对于那些将来可能会遇到此问题的人,这里是原始 post 中的代码片段,其中应用了所选答案的修复:
Instant time = Instant.now();
ZonedDateTime zonedTime = time.atZone(ZoneId.systemDefault());
System.out.println("UTC time: " + time + " Local: " + zonedTime.toOffsetDateTime());
我刚开始使用 Java 的内置时间 API。我正在尝试以 UTC 格式获取当前时间,并且我希望能够将其转换为 运行 程序所在的时区。现在我有这个代码:
Clock clock = Clock.systemUTC();
LocalDateTime time = LocalDateTime.now(clock);
ZonedDateTime zonedTime = time.atZone(ZoneId.systemDefault());
System.out.println("UTC time: " + time + " Local: " + zonedTime);
然而,这打印出来:
UTC time: 2022-06-01T15:25:57.933673600 Local: 2022-06-01T15:25:57.9336736-05:00
它似乎正在获取正确的时区,但并未将其应用于输出。所以如果我打印
time.getHour()
zonedTime.getHour()
他们都打印出“15”。让它给我应用时区偏移的时间的正确方法是什么? UTC时间是15,而我的本地时间是10。我希望能够将UTC转换成时区时间。
原因是我正在设置保存文件 - 所以我想记录保存文件时的 UTC 时间,然后在用户检查时能够显示用户时区的时间他们计算机上的保存日期。
感谢您的宝贵时间!
问题出在您对 LocalDateTime
的使用上。它不知道它在哪个时区 - 所以当你使用 LocalDateTime.atZone
时,它假设你想保持相同的本地 date/time.
此处最好的解决方法是将 LocalDateTime.now(clock)
更改为 Instant.now(clock)
。您感兴趣的是“当前时刻”,而不是“UTC 当地时间”。
或者,在系统时区中使用 Clock
ZonedDateTime.now(clock)
。
对于那些将来可能会遇到此问题的人,这里是原始 post 中的代码片段,其中应用了所选答案的修复:
Instant time = Instant.now();
ZonedDateTime zonedTime = time.atZone(ZoneId.systemDefault());
System.out.println("UTC time: " + time + " Local: " + zonedTime.toOffsetDateTime());