如何在Java中将ZonedDateTime转换为milliSecond? [关闭]

问题描述 投票:0回答:1

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

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

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

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

java epoch zoneddatetime
1个回答
2
投票

您正在使用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:3​​1.016 + 02:00 [欧洲/巴黎] 2019-04-12T08:40:31.016 + 05:30 [亚/加尔各答]

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

long e = Instant.now().toEpochMilli();
© www.soinside.com 2019 - 2024. All rights reserved.