如何在Java中将ZonedDateTime转换为毫秒?

2022-09-01 14:01:13

我正在尝试使用以下代码将ZonedDateTime转换为毫秒。

LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of(""Asia/Kolkata""));
zonedDateTime.toInstant().toEpochMilli();

但是这个返回基于本地时间的毫秒。它没有考虑ZoneId。

比方说.如果我将其转换为区域ID(“亚洲/加尔各答”),那么我得到()。然后,我在 UTC 中转换为 EpochMilli (1554854400000) = ()。LocalDateTime("2019-04-10T05:30")ZonedDateTime"2019-04-10T05:30+05:30[Asia/Kolkata]""Wed Apr 10 2019 00:00:00"


答案 1

您正在使用 来获取该毫秒表示形式。即时不是基于区域的。现在,纪元时间基于“1970-01-01T00:00:00Z”,因此不应在其中包含区域。Instant

如果要创建一个 from epoch 值,只需在该 epoch 时间创建一个,然后创建一个具有所需区域的 :ZoneDateTimeInstantZonedDateTime

//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[欧洲/巴黎]
2019-04-12T08:40:31.016+05:30[亚洲/加尔各答]

注意:上面的代码不应该这样使用,没有必要得到一个然后a来最终创建一个。这只是为了表明,即使有一个区域,它也会在某一点上“丢失”。
只需使用 :LocalDateTimeZonedDateTimeInstant

long e = Instant.now().toEpochMilli();

答案 2
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of("UTC"));
zonedDateTime.toInstant().toEpochMilli();