在 SpringBoot 中使用 LocalDateTime 在本地和远程获取不同的时间戳

我像这样使用 LocalDateTime 打印大纪元时间

System.out.println("timestamp "+LocalDateTime.now().atZone(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli());

因此,每当我在 Intellij 中本地运行这段代码时,我都会得到正确的时间戳,加尔各答时区约为1559461130527. 这是大约Sunday, June 2, 2019 1:23:50.527 PM加尔各答时间

然后我有一个带有 docker 容器的服务器,每当我运行这段相同的代码时,我都会得到一个完全不同的时间戳,大约是1559439902340. 这是周围Sunday, June 2, 2019 7:30:02.340 AM

我错过了什么,服务器不应该根据指定的时区打印时间戳。任何帮助,将不胜感激。谢谢。


蝴蝶刀刀
浏览 347回答 2
2回答

慕桂英3389331

您应该在 now() 语句中使用区域偏移量。例如要获取我使用的 UTC 时间LocalDateTime.now(ZoneOffset.UTC);在您的情况下,您可以直接使用时区的 ZoneIdLocalDateTime.now(ZoneId.of("Asia/Kolkata"));

慕森王

如果你看一下LocalDateTime::now方法的实现,它看起来像:public static LocalDateTime now() {     return now(Clock.systemDefaultZone()); }因此它将使用Clock您系统的实现默认值。可能您在容器中使用不同的操作系统,这就是为什么会使用不同的默认时钟。因此LocalDateTime::now,在您的情况下,方法调用将根据系统默认值返回不同的值Clock。然后,如果您想将其转换为ZonedDateTimeusingatZone方法 - 您将在同一区域有不同的时间 - 因为LocalDateTime::now在不同的操作系统中为不同的默认时钟返回不同的值。为了克服这个问题,您可以ZonedDateTime直接使用类并将区域传递给now方法:ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java