我支持一个大型企业应用程序,我们有两个使用LocalDate.now获取时间戳的类,一个使用joda time,一个使用Java time。通常我们每晚都会重启,但本周早些时候我们无法重启。在应用程序运行的第二天,使用joda time的类返回正确的日期(20200505),而使用Java time的类返回应用程序打开的日期(20200504)。
这两个类在每次调用方法时都会在方法中对LocalDate.now进行新的调用。
Java时间:
String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
//Use timestamp
Joda时间:
LocalDate date = LocalDate.now();
String format1 = date.toString("MM/dd/yyyy");
//Use date
为什么LocalDate.now的Java8实现在服务器日期更改后返回错误的日期,而没有重新启动应用程序?
发布于 2020-05-07 20:48:08
有问题的类是一个枚举,在另一个调用中,枚举中字段的值被更改和保存,所以当应用程序进行时间戳替换时,占位符在第一次调用后不再在枚举中。谁知道为什么呢。修复了这个问题,Java时间没有问题。
发布于 2020-05-07 13:43:35
本地日期取决于默认时区,因为没有全局日期。我假设您的服务器中的时区已关闭,并且在午夜过后的几个小时内,它仍然返回昨天的日期。在配置服务器以UTC模式运行时,这是一个非常常见的配置错误,而实际时区更多地位于东侧。
https://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html#getDefault--
如果缓存的默认TimeZone可用,则返回其克隆。否则,该方法将执行以下步骤来确定默认时区。
如果平台时区ID为available.
您可以通过在更改默认时区后获取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);
}
因此,问题是:您的服务器使用的时区是
https://stackoverflow.com/questions/61658753
复制相似问题