gpt4 book ai didi

java - 使用新的 java.util.Date() 返回 DST 落后一小时

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:53 28 4
gpt4 key购买 nike

我有一个 Java 程序作为 cron 作业在 linux 虚拟机上运行。当前存在一个问题,以下行用作日志记录的一部分以存储当前日期和时间:

String date = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(new Date());

今天夏令时过后,确定系统日期设置不正确,因为它没有更新。在使用以下命令修复此问题并重新启动 linux 环境后,日期现在是正确的并且已更新为夏令时。

ln -s /usr/share/zoneinfo/America/New_York /etc/localtime

但是,当 Java 程序作为 cron 作业的一部分执行时,日期仍然晚了一个小时。这会导致内部计时问题,因为 new Date() 用于获取当前系统时间,这会导致进程中的后续问题。例如在下午 5:00,Java 程序输出下午 4:00。这个实现是否有额外的考虑? new Date() 不应该总是返回当前系统日期吗?

将调试行添加到 cron 作业,这会在预期的正确时间执行。

最佳答案

tl;dr

  • Instant.now()
  • Update 你的 JVM 的 tzdata
  • 使用 UTC 工作,尤其是日志记录
  • 序列化为 ISO 8601 格式

日期

Shouldn't new Date() always return the current system date?

是的,Date 类始终以 UTC 格式捕获当前时刻。让我重复一遍:Date 以 UTC 格式捕捉时刻。

问题来自该类的 toString 方法的一个善意但不幸的“特性”,其中 JVM 当前默认时区用于生成该字符串。避免这个过时且麻烦的类(class)的众多原因之一。

我怀疑您的“tzdata”时区数据文件已过时,无法识别 DST 转换的新日期。

重启JVM

Java 实现通常在启动时从主机操作系统中获取它们当前的默认时区。在 JVM 之后,更改主机操作系统的时区对 JVM 没有影响。

重新启动 JVM 以在主机操作系统中获取新的区域设置。

在服务器上使用 UTC

最佳做法通常是将您的服务器设置为 UTC。那么你不必担心夏令时的废话。

在 UTC 中工作

您的大部分编程、日志记录、cron 作业、数据交换和数据序列化都应该使用 UTC。

例如,请注意 Stack Overflow 如何使用 UTC 报告您“今天”和“昨天”的 Activity 。学会将 UTC 视为唯一真实时间;所有区域都是该主题的变体。

仅在关键时应用时区,例如在向期望特定时区的用户进行演示时。

请记住,您的问题不是由于时空弯曲造成的。秒、分和小时继续正常递增,就 UTC 而言,滴答滴答。您的问题在于错误翻译成具有过时时区规则更改数据的时区。

在 Java 代码中指定您想要的区域

您的 Java 应用程序应始终明确指定其所需/预期的时区。如果省略,则隐式应用 JVM 当前的默认时区。

JVM 默认值可以随时被 JVM 内任何应用程序的任何线程中的任何代码更改,并立即影响该 JVM 中的所有其他代码。所以永远不要依赖当前的默认值来做任何重要的事情。与用户确认,并在您的代码中明确指定。

避免遗留日期时间类

包括 DateCalendar 在内的旧日期时间类一团糟。避开他们。它们现在是遗留的,被 java.time 类所取代。

Instant 类是时间线上的一个时刻,分辨率以纳秒为单位,始终采用 UTC。

Instant instant = Instant.now() ;

要生成标准 ISO 8601 格式的字符串,请调用 toString。末尾的 Z 是 Zulu 的缩写,表示 UTC。

String output = instant.toString() ;

2017-01-23T12:34:56.123456789Z

使用这两行简单的代码可以避免整个问题。

但是你应该定期更新 tzdata 在:

  • 主机操作系统
  • 虚拟机
  • 数据库系统(Postgres等)
  • Joda-Time 等库

关于java - 使用新的 java.util.Date() 返回 DST 落后一小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42773913/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com