web-dev-qa-db-ja.com

JavaでZonedDateTimeをmilliSecondに変換する方法は?

以下のコードを使用して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"_)に変換します。

9
Arun

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();
16
AxelH