在 Spring Boot 中使用 LocalDateTime 在本地和远程获取不同的时间戳(纪元时间)
Getting different timestamp(epoch time) locally and remotely while using LocalDateTime in SpringBoot
我正在像这样使用 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
。
我错过了什么,服务器不是应该根据指定的时区打印时间戳吗?任何帮助,将不胜感激。谢谢。
您应该在 now() 语句中使用区域偏移量。
例如要获取 UTC 时间我使用 LocalDateTime.now(ZoneOffset.UTC);
在您的情况下,您可以直接使用您所在时区的 ZoneId
LocalDateTime.now(ZoneId.of("Asia/Kolkata"));
如果您查看 LocalDateTime::now
方法的实现,它看起来像:
public static LocalDateTime now() {
return now(Clock.systemDefaultZone());
}
因此它将使用您系统的 Clock
实现默认值。可能您在容器中使用了不同的操作系统,这就是为什么会使用不同的默认时钟。
因此,在您的情况下,LocalDateTime::now
方法调用将 return 不同的值,具体取决于系统默认值 Clock
。然后,如果您想使用 atZone
方法将其转换为 ZonedDateTime
- 您将在同一区域有不同的时间 - 因为 LocalDateTime::now
return 为不同的默认时钟编辑了不同的值在不同的操作系统中。
要克服这个问题,您可以直接使用 ZonedDateTime
class 并将区域传递给 now
方法:
ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli();
我正在像这样使用 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
。
我错过了什么,服务器不是应该根据指定的时区打印时间戳吗?任何帮助,将不胜感激。谢谢。
您应该在 now() 语句中使用区域偏移量。
例如要获取 UTC 时间我使用 LocalDateTime.now(ZoneOffset.UTC);
在您的情况下,您可以直接使用您所在时区的 ZoneId
LocalDateTime.now(ZoneId.of("Asia/Kolkata"));
如果您查看 LocalDateTime::now
方法的实现,它看起来像:
public static LocalDateTime now() {
return now(Clock.systemDefaultZone());
}
因此它将使用您系统的 Clock
实现默认值。可能您在容器中使用了不同的操作系统,这就是为什么会使用不同的默认时钟。
因此,在您的情况下,LocalDateTime::now
方法调用将 return 不同的值,具体取决于系统默认值 Clock
。然后,如果您想使用 atZone
方法将其转换为 ZonedDateTime
- 您将在同一区域有不同的时间 - 因为 LocalDateTime::now
return 为不同的默认时钟编辑了不同的值在不同的操作系统中。
要克服这个问题,您可以直接使用 ZonedDateTime
class 并将区域传递给 now
方法:
ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).toInstant().toEpochMilli();