JSR 310 :: System.currentTimeMillis() vs Instant.toEpochMilli() :: TimeZone
您能否详细说明如何获得默认系统时区和给定时区的正确纪元时间(以毫秒为单位)。
特定
1. TimeZone:GMT + 3
2.以下代码段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import java.time.*; public class Main { public static void main(String[] args) { System.out.println(LocalDateTime .now() .atZone(ZoneOffset.UTC) .toInstant() .toEpochMilli() ); System.out.println(LocalDateTime .now() .atZone(ZoneOffset.of("+3")) .toInstant() .toEpochMilli() ); System.out.println(System.currentTimeMillis()); } } |
3.输出:
1 2 3 | 1444158955508 1444148155508 1444148155508 |
4.用于System.currentTimeMillis()的JavaDoc,它告诉返回的值将是当前时间与1970年1月1日UTC午夜之间的差值(以毫秒为单位)。
所以为什么
所以
但
精简版:
无法计算
使用时区,您可以获得
长版:
LocalDateTime是时钟上的时间(加上日期信息)。如果你不告诉我们你所在的时区,那还不够。东京时间13点不一样巴黎时间13点。
将时区添加到LocalDateTime后,您将获得ZonedDateTime,我们可以知道您实际上是在哪个瞬间。例如。你在东京或巴黎的13点吗?
要获得正确的Instant,ZonedDateTime的时区需要正确。如果是东京时间下午1点,但你声称自己是巴黎的13点,那么你将得到一个错误的瞬间。
LocalDateTime:
It cannot represent an instant on the time-line without additional information such as an offset or time-zone.
ZonedDateTime:
This class handles conversion from the local time-line of LocalDateTime to the instant time-line of Instant. The difference between the two time-lines is the offset from UTC/Greenwich, represented by a ZoneOffset.
要获得Instant,您需要先将LocalDateTime转换为ZonedDateTime。如果您正确执行此操作(通过声明正确的时区),您的Instant将同意System.currentTimeMillis()。
System.currentTimeMillis的():
the difference, measured in milliseconds, between the current time and midnight, January 1, 1970 UTC.
如果您的时区是GMT + 3,那么ZonedDateTime.toInstant()将为您提供正确的Instant,因此同意System.currentTimeMillis()
如果您的时区不是UTC,那么ZonedDateTime.toInstant()会给您一个不正确的Instant。