org.joda.time.DateTime から java.time.ZonedDateTime に変換する方法 質問する

org.joda.time.DateTime から java.time.ZonedDateTime に変換する方法 質問する

joda time DateTime オブジェクトが保存されたデータ ソースがあります。元のタイムゾーンを維持しながら、それらを Java ZonedDateTime オブジェクトに変換する必要があります。

一部の DateTime オブジェクトは毎日の繰り返しタスクを表し、これらのタスクは日付ごとに特定のタイム ゾーンの特定の時間に実行する必要があるため、オフセットを保持するだけでは不十分です。したがって、夏時間と冬時間などの指定された TimeZone 遷移に従う必要があります。DateTime オブジェクトの最終的な使用方法はわかりません。そのため、安全のためにすべてのオブジェクトのタイム ゾーン情報を保持する必要があります。

org.joda.time.DateTime から java.time.ZonedDateTime に変換するにはどうすればいいですか?

意思全て

ord.joda.time.DateTimeZone.getId()

利用可能なIDにマップする

タイムゾーンID

ベストアンサー1

夏時間への移行を行う場合は、各フィールドを個別に指定しないでください。次の例のように、代わりに epochMillis を使用して変換します。

Instant instant = Instant.ofEpochMilli(dt.getMillis());
ZoneId zoneId = ZoneId.of(dt.getZone().getID(), ZoneId.SHORT_IDS);
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, zoneId);

そうしないと、移行日に 1 時間遅れることになります。たとえば、ドイツは 2017 年 10 月 29 日 03:00 GMT+2 に夏時間 (GMT+2) から冬時間 (GMT+1) に移行し、02:00 GMT+1 になりました。その日には、02:00 のインスタンスが 2 つあります。1 つは GMT+2 の早い時間で、もう 1 つは GMT+1 の遅い時間です。

オフセットではなく ZoneId を扱っているため、2 つのインスタンスのどちらが必要かを知る方法はありません。デフォルトでは、変換時に最初のインスタンスが想定されます。ZoneId と一緒に指定すると、02:00 GMT+2 と 02:00 GMT+1 の両方が 02:00 GMT+2 に変換されますhourOfDay

おすすめ記事