以下のコードを使用して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
を使用して、そのミリ秒表現を取得しています。インスタントはゾーンベースではありません。現在、エポック時間は「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();