我像这样使用 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"));
慕森王
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();添加回答
举报
0/150
提交
取消
