在SpringBoot中使用LocalDateTime时,在本地和远程获取不同的时间戳(纪元时间)

时间:2019-06-02 09:19:57

标签: java spring-boot epoch docker-container localdate

我正在像这样使用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 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

如果您查看LocalDateTime::now方法的实现,如下所示:

public static LocalDateTime now() {
    return now(Clock.systemDefaultZone());
}

因此它将为您的系统使用Clock实现默认值。可能您的容器中使用的操作系统不同,这就是为什么将使用不同的默认时钟的原因。

因此,在您的情况下,LocalDateTime::now方法调用将根据系统默认值Clock返回不同的值。然后,如果您想使用ZonedDateTime方法将其转换为atZone-您将在同一区域中拥有不同的时间-因为LocalDateTime::now在不同的操作系统中为不同的默认时钟返回了不同的值。

要解决此问题,您可以直接使用ZonedDateTime类,并将区域传递给now方法:

ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli();