我像这样使用 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
。然后,如果您想将其转换为ZonedDateTime
usingatZone
方法 - 您将在同一区域有不同的时间 - 因为LocalDateTime::now
在不同的操作系统中为不同的默认时钟返回不同的值。
为了克服这个问题,您可以ZonedDateTime
直接使用类并将区域传递给now
方法:
ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli();
添加回答
举报
0/150
提交
取消