既存の ZonedDateTime
オブジェクトの時刻部分を変更するにはどうすればよいですか?日付と時間帯は保持したいが、時間と分は変更したい。
_zdt.with ( LocalTime.of ( 16 , 15 ) )
_
Java.timeクラスは Immutable Objects パターンを使用して、元のオブジェクトを変更(「変更」)するのではなく、新しいオブジェクトを作成します。
with()
_ZonedDateTime::with
_ メソッドは、別のZonedDateTime
を生成するための柔軟な方法ですが、特定の違いがあります。 TemporalAdjustor
インターフェースを実装する任意のオブジェクトを渡すことができます。
この場合は、時刻のみを変更します。 LocalTime
オブジェクトは、日付およびタイムゾーンなしの時刻を表します。そして、LocalTime
は TemporalAdjustor
インターフェースを実装します。したがって、日付とタイムゾーンをそのまま維持しながら、その時刻の値のみが適用されます。
_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
インターフェースを実装しています。 LocalDate
、Month
、Year
などのクラスドキュメントのリストを参照してください。したがって、それらのいずれかを渡して、日時値のその側面を変更できます。
Hochschildのコメントを読んでください。特定の日付とゾーンに対して無効な時刻を指定するときの動作を理解する必要があります。たとえば、夏時間(DST)の切り替え中です。