簡體   English   中英

如何在 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();

但是這個基於本地時間返回毫秒。 而且它沒有考慮 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[歐洲/巴黎]
2019-04-12T08:40:31.016+05:30[亞洲/加爾各答]

注意:上面的代碼不應該這樣使用,沒有必要先獲取LocalDateTime然后再獲取ZonedDateTime來最終創建Instant 這只是為了表明即使有一個區域,這也會在某一時刻“丟失”。
只需使用:

long e = Instant.now().toEpochMilli();
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zonedDateTime =ldt.atZone(ZoneId.of("UTC"));
zonedDateTime.toInstant().toEpochMilli();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM