最近我在 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(书虫)
当然!以下是用更对话的语气修改后的解释:
即使更改服务器时区后,
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()
的要求。
希望这有助于您澄清事情!