如何在 Java 中将 ZonedDateTime 转换为毫秒?
How to convert ZonedDateTime to milliSecond in Java?
我正在尝试使用以下代码将 ZonedDateTime 转换为毫秒。
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of(""Asia/Kolkata""));
zonedDateTime.toInstant().toEpochMilli();
但是这个 returns 毫秒是基于当地时间。而且它没有考虑 ZoneId。
假设 LocalDateTime("2019-04-10T05:30")
。如果我将其转换为具有区域 ID ("Asia/Kolkata") 的 ZonedDateTime
,那么我将得到 ("2019-04-10T05:30+05:30[Asia/Kolkata]"
)。然后我在 UTC 中转换为 EpochMilli (1554854400000) = ("Wed Apr 10 2019 00:00:00"
)。
您正在使用 Instant
来表示毫秒。 Instant 不是基于区域的。现在,纪元时间基于“1970-01-01T00:00:00Z”,因此您不应该在其中包含时区。
如果你想从纪元值创建一个 ZoneDateTime
,你可以简单地在那个纪元时间创建一个 Instant
,然后用你想要的区域创建一个 ZonedDateTime
:
//Let's create our zone time (just to keep your logic
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of("Asia/Kolkata"));
//Then get the epoch on GMT
long e = zonedDateTime.toInstant().toEpochMilli();
Instant i = Instant.ofEpochMilli(e);
System.out.println(ZonedDateTime.ofInstant(i, ZoneId.systemDefault()));
System.out.println(ZonedDateTime.ofInstant(i, ZoneId.of("Asia/Kolkata")));
2019-04-12T05:10:31.016+02:00[Europe/Paris]
2019-04-12T08:40:31.016+05:30[Asia/Kolkata]
注意:上面的代码不应该这样使用,没有必要得到一个 LocalDateTime
然后一个 ZonedDateTime
最终创建一个 Instant
。这只是为了表明即使有一个区域,在某一时刻也将是 "lost"。
只需使用:
long e = Instant.now().toEpochMilli();
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of("UTC"));
zonedDateTime.toInstant().toEpochMilli();
我正在尝试使用以下代码将 ZonedDateTime 转换为毫秒。
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of(""Asia/Kolkata""));
zonedDateTime.toInstant().toEpochMilli();
但是这个 returns 毫秒是基于当地时间。而且它没有考虑 ZoneId。
假设 LocalDateTime("2019-04-10T05:30")
。如果我将其转换为具有区域 ID ("Asia/Kolkata") 的 ZonedDateTime
,那么我将得到 ("2019-04-10T05:30+05:30[Asia/Kolkata]"
)。然后我在 UTC 中转换为 EpochMilli (1554854400000) = ("Wed Apr 10 2019 00:00:00"
)。
您正在使用 Instant
来表示毫秒。 Instant 不是基于区域的。现在,纪元时间基于“1970-01-01T00:00:00Z”,因此您不应该在其中包含时区。
如果你想从纪元值创建一个 ZoneDateTime
,你可以简单地在那个纪元时间创建一个 Instant
,然后用你想要的区域创建一个 ZonedDateTime
:
//Let's create our zone time (just to keep your logic
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of("Asia/Kolkata"));
//Then get the epoch on GMT
long e = zonedDateTime.toInstant().toEpochMilli();
Instant i = Instant.ofEpochMilli(e);
System.out.println(ZonedDateTime.ofInstant(i, ZoneId.systemDefault()));
System.out.println(ZonedDateTime.ofInstant(i, ZoneId.of("Asia/Kolkata")));
2019-04-12T05:10:31.016+02:00[Europe/Paris]
2019-04-12T08:40:31.016+05:30[Asia/Kolkata]
注意:上面的代码不应该这样使用,没有必要得到一个 LocalDateTime
然后一个 ZonedDateTime
最终创建一个 Instant
。这只是为了表明即使有一个区域,在某一时刻也将是 "lost"。
只需使用:
long e = Instant.now().toEpochMilli();
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of("UTC"));
zonedDateTime.toInstant().toEpochMilli();