ZonedDateTime
既存のオブジェクトの時刻部分を変更するにはどうすればよいですか? 日付とタイムゾーンは保持したいが、時間と分を変更したい。
1 に答える
tl;dr
zdt.with ( LocalTime.of ( 16 , 15 ) )
不変オブジェクト
java.time クラスは、元のオブジェクトを変更 (「変更」) するのではなく、不変オブジェクトパターンを使用して新しいオブジェクトを作成します。
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
オブジェクトには、時、分、秒、秒の端数が含まれています。時間と分を指定しました。秒と小数秒を省略した0
ため、 の構築中に両方のデフォルト値が発生しましたLocalTime
。の 4 つの側面すべてLocalTime
を適用して、新鮮なZonedDateTime
.
かなりの数のクラスがTemporalAdjustor
インターフェースを実装しています。、 、 などを含むLocalDate
、そのクラス ドキュメントのリストを参照してください。したがって、それらのいずれかを渡して、日時値のその側面を変更できます。Month
Year
Hochschild のコメントを読んでください。特定の日付とゾーンに対して無効な時刻を指定した場合の動作を理解する必要があります。たとえば、夏時間 (DST) のカットオーバー中です。