【问题标题】:Joda Time Returns Correct Date, but Java Time Doesn'tJoda Time 返回正确的日期,但 Java 时间没有
【发布时间】:2020-08-22 19:20:48
【问题描述】:

我支持一个大型企业应用程序,我们有两个类使用 LocalDate.now 来获取时间戳,一个使用 joda 时间,一个使用 Java 时间。通常我们每晚都重新开始,但本周早些时候我们无法重新开始。在应用程序运行的第二天,使用 joda 时间的类返回了正确的日期(20200505),但使用 Java 时间的类返回了应用程序开启的日期(20200504)。

这两个类在每次调用时都会在方法中对 LocalDate.now 进行新调用。

Java时间:

String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
//Use timestamp

乔达时间:

LocalDate date = LocalDate.now();
String format1 = date.toString("MM/dd/yyyy");
//Use date

为什么 LocalDate.now 的 Java 8 实现在服务器日期更改后没有重新启动应用程序就返回错误的日期?

【问题讨论】:

  • 应用程序是否在两个不同的主机上运行?
  • 我怀疑这是代码问题并质疑您的设置。这两个类都使用系统时钟提供的信息。如果系统时钟显示它仍然是 4-th,那么 Java(和 Joda)将返回 4-th。特别是因为它是LocalDate,因此不包括任何时区。
  • 你能edit你的问题并包括minimal reproducible example吗?
  • no-arg LocalDate.now 方法(java.time 和 Joda-Time)都使用默认时区(所有时区中的日期都不会相同)。可以将 Joda-Time 的默认 DateTimeZone 设置为与 JVM 的默认时区不同,这可能是观察到的差异的一种可能解释(尽管可能不是最有可能的?)。
  • 这些类在同一个应用程序中,处理不同的文件类型。主机使用东部时区,但是Java时间的故障发生在第二天下午2点左右,所以即使Java时间使用了一个奇怪的时区,它应该已经超过了日期更改。服务器时间在 EST 中是准确的,因为我们的日志显示了正确的时间戳。

标签: java jodatime java-time


【解决方案1】:

有问题的类是一个枚举,结果在另一个调用中,枚举中的一个字段的值被更改并保存了,所以当应用程序进行时间戳替换时,占位符不再在第一次调用后的枚举。谁知道为什么。解决这个问题就解决了问题,Java 时间没有问题。

【讨论】:

    【解决方案2】:

    本地日期取决于默认时区,因为没有全球日期。 我假设您服务器中的时区已关闭,这仍然会在午夜后的几个小时内返回昨天的日期。在将服务器配置为以 UTC 运行而实际时区更多地位于东部时,这是一个非常常见的配置错误。

    https://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html#getDefault--

    如果缓存的默认时区可用,则返回其克隆。 否则,该方法采取以下步骤来确定 默认时区。

    • 使用 user.timezone 属性值作为默认时区 ID(如果可用)。
    • 检测平台时区 ID。平台时区和 ID 映射的来源可能因实施而异。
    • 如果给定或检测到的时区 ID 未知,则使用 GMT 作为最后的手段。

    您可以在更改默认时区后通过获取LocalDate.now() 轻松验证:

    TimeZone defaultTimeZone = TimeZone.getDefault();
    try {
        Arrays.stream(TimeZone.getAvailableIDs())
            .map(TimeZone::getTimeZone)
            .forEach(timeZone -> {
                TimeZone.setDefault(timeZone);
                System.out.printf("%s in %s (%s)\n",
                    LocalDate.now(), timeZone.getID(), timeZone.getDisplayName());
            });
    } finally {
        TimeZone.setDefault(defaultTimeZone);
    }
    

    所以问题是:您的服务器使用哪个时区

    【讨论】:

    • 我们的服务器使用 EST。即使我们被配置为使用 UTC,我们难道不希望日期在第二天(晚上 7 点之后)而不是前一天吗?
    猜你喜欢
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2015-10-19
    • 1970-01-01
    • 2014-01-04
    • 2013-12-07
    相关资源
    最近更新 更多