24

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

4

1 に答える 1

44

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、そのクラス ドキュメントのリストを参照してください。したがって、それらのいずれかを渡して、日時値のその側面を変更できます。MonthYear

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

于 2016-04-27T23:49:57.617 に答える