为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蝴蝶刀刀 2022-12-28 16:08:40
我像这样使用 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。我错过了什么,服务器不应该根据指定的时区打印时间戳。任何帮助,将不胜感激。谢谢。
查看完整描述

2 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

您应该在 now() 语句中使用区域偏移量。

例如要获取我使用的 UTC 时间LocalDateTime.now(ZoneOffset.UTC);

在您的情况下,您可以直接使用时区的 ZoneId

LocalDateTime.now(ZoneId.of("Asia/Kolkata"));


查看完整回答
反对 回复 2022-12-28
?
慕森王

TA贡献1777条经验 获得超3个赞

如果你看一下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();


查看完整回答
反对 回复 2022-12-28
  • 2 回答
  • 0 关注
  • 346 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号