web-dev-qa-db-ja.com

Java.timeでZonedDateTimeに時刻を設定しますか?

既存の ZonedDateTime オブジェクトの時刻部分を変更するにはどうすればよいですか?日付と時間帯は保持したいが、時間と分は変更したい。

18
Basil Bourque

tl; dr

_zdt.with ( LocalTime.of ( 16 , 15 ) )
_

不変オブジェクト

Java.timeクラスは Immutable Objects パターンを使用して、元のオブジェクトを変更(「変更」)するのではなく、新しいオブジェクトを作成します。

with()

_ZonedDateTime::with_ メソッドは、別のZonedDateTimeを生成するための柔軟な方法ですが、特定の違いがあります。 TemporalAdjustor インターフェースを実装する任意のオブジェクトを渡すことができます。

この場合は、時刻のみを変更します。 LocalTime オブジェクトは、日付およびタイムゾーンなしの時刻を表します。そして、LocalTimeTemporalAdjustor インターフェースを実装します。したがって、日付とタイムゾーンをそのまま維持しながら、その時刻の値のみが適用されます。

_ZonedDateTime marketOpens = ZonedDateTime.of ( LocalDate.of ( 2016 , 1 , 4 ) , LocalTime.of ( 9 , 30 ) , ZoneId.of ( "America/New_York" ) );
ZonedDateTime marketCloses = marketOpens.with ( LocalTime.of ( 16 , 0 ) );
_

期間の長さが予想どおり、6時間半であることを再確認します。

_Duration duration = Duration.between ( marketOpens , marketCloses );
_

コンソールにダンプします。

_System.out.println ( "marketOpens: " + marketOpens + " | marketCloses: " + marketCloses + " | duration: " + duration );
_

marketOpens:2016-01-04T09:30-05:00 [アメリカ/ニューヨーク] | marketCloses:2016-01-04T16:00-05:00 [アメリカ/ニューヨーク] |期間:PT6H30M

この例では、時刻の暗黙的に秒と小数秒を調整するでもあることに注意してください。 LocalTimeオブジェクトには、時間、分、秒、秒の小数部が含まれています。時間と分を指定しました。秒と小数秒を省略したため、LocalTimeの構築中、デフォルト値は_0_になります。 LocalTimeの4つの側面すべてが適用され、新しいZonedDateTimeが取得されました。

かなりの数のクラスが TemporalAdjustor インターフェースを実装しています。 LocalDateMonthYearなどのクラスドキュメントのリストを参照してください。したがって、それらのいずれかを渡して、日時値のその側面を変更できます。

Hochschildのコメントを読んでください。特定の日付とゾーンに対して無効な時刻を指定するときの動作を理解する必要があります。たとえば、夏時間(DST)の切り替え中です。

31
Basil Bourque