Joda时间返回正确的日期,但Java时间不返回

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

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

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

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

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

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

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

  • 如果可用,请使用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);
}

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

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