更改时区不会使 LocalTime.now() 返回不同的值,为什么?

问题描述 投票:0回答:1

最近我在 Google Cloud Platform 上创建了一个虚拟机来运行我的 .jar 24/7,我的部分代码如下:

if (LocalTime.now().getHour() == 0)
    whenDateChanged();

我注意到它在 UTC+0 上午 12 点运行,但我希望它在 UTC+8 上午 12 点运行,所以我在终端中使用此命令来更改服务器的时区:

sudo timedatectl set-timezone "Asia/Taipei"

重新启动服务器后,

whenDateChanged()
仍然在 UTC+8 上午 8 点运行,为什么会发生这种情况?

Java版本:21.0.3
操作系统:Debian GNU/Linux,12(书虫)

java timezone java-time
1个回答
0
投票

当然!以下是用更对话的语气修改后的解释:


即使更改服务器时区后,

LocalTime.now()
仍然返回相同的值,因为
LocalTime
实际上并不考虑时区。它只是根据系统时钟反映当前时间,无论服务器上的时区设置如何。

为了确保您的代码遵循新时区 (

Asia/Taipei
),您需要使用
ZonedDateTime
而不是
LocalTime
。以下是调整代码的方法:

import java.time.*;

// Use ZonedDateTime to get the current time in a specific time zone
if (ZonedDateTime.now(ZoneId.of("Asia/Taipei")).getHour() == 0) {
    whenDateChanged();
}

在此更新的代码中:

  • ZonedDateTime.now(ZoneId.of("Asia/Taipei"))
    为您提供
    Asia/Taipei
    时区的当前日期和时间。
  • .getHour()
    检索台北时间当前时间的小时部分。
  • 这可确保您的
    whenDateChanged()
    方法在台北时间 (UTC+8) 午夜 (00:00) 正确触发。

通过使用

ZonedDateTime
,您明确告诉 Java 考虑指定的时区 (
Asia/Taipei
),这将反映您在服务器上使用
timedatectl
所做的更改。

此方法应该可以解决问题,并符合您在更改服务器时区设置后在 UTC+8(台北时间)午夜运行

whenDateChanged()
的要求。

希望这有助于您澄清事情!

© www.soinside.com 2019 - 2024. All rights reserved.