我支持大型企业应用程序,我们有两个使用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为什么返回错误的日期?
本地日期取决于默认时区,因为没有全局日期。我假设您的服务器所在的时区已关闭,并且仍会在午夜之后的几个小时返回昨天的日期。当将服务器配置为以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);
}
所以问题是:您的服务器使用哪个时区?