Java 在SpringBoot中使用LocalDateTime时在本地和远程获取不同的时间戳(历元时间)
我使用LocalDateTime打印划时代时间,如下所示Java 在SpringBoot中使用LocalDateTime时在本地和远程获取不同的时间戳(历元时间),java,spring-boot,epoch,docker-container,localdate,Java,Spring Boot,Epoch,Docker Container,Localdate,我使用LocalDateTime打印划时代时间,如下所示 System.out.println("timestamp "+LocalDateTime.now().atZone(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli()); 因此,每当我在Intellij本地运行这段代码时,我都会得到加尔各答时区的正确时间戳,大约为1559461130527。这大约是加尔各答时间2019年6月2日星期日下午1:23:50.527 然后我有一个带有d
System.out.println("timestamp "+LocalDateTime.now().atZone(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli());
因此,每当我在Intellij本地运行这段代码时,我都会得到加尔各答时区的正确时间戳,大约为1559461130527
。这大约是加尔各答时间2019年6月2日星期日下午1:23:50.527
然后我有一个带有docker容器的服务器,每当我在那里运行同一段代码时,我都会得到一个完全不同的时间戳,大约是1559439902340
。这大约是2019年6月2日星期日上午7:30:02.340
我缺少的是,服务器不应该根据指定的时区打印时间戳吗。任何帮助都将不胜感激。谢谢。您应该在now()语句中使用区域偏移量 例如,为了获得UTC时间,我使用
LocalDateTime.now(ZoneOffset.UTC)代码>
在您的情况下,您可以直接使用时区ID
LocalDateTime.now(亚洲/加尔各答地区)
如果您查看LocalDateTime::now
方法的实现,该方法如下所示:
public static LocalDateTime now() {
return now(Clock.systemDefaultZone());
}
因此,它将为您的系统使用时钟
实现默认值。可能您在容器中使用了不同的操作系统,这就是为什么会使用不同的默认时钟
因此,在您的情况下,LocalDateTime::now
方法调用将根据系统默认值Clock
返回不同的值。然后,如果要使用atZone
方法将其转换为ZonedDateTime
,则在同一区域中会有不同的时间,因为LocalDateTime::now
在不同的操作系统中为不同的默认时钟返回了不同的值
要克服这一问题,您可以直接使用ZoneDateTime
类并将区域传递到now
方法:
ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli();