Java 8 の日付時間:ZonedDateTime から日の始まりを取得する
質問
これらは何か違いがあるのでしょうか。
zonedDateTime.truncatedTo(ChronoUnit.DAYS);
zonedDateTime.toLocalDate().atStartOfDay(zonedDateTime.getZone());
どちらか一方を選ぶ理由は?
ありがとうございます。
どのように解決するのですか?
訂正のため、更新しました。
ほとんどの場合、同じです。 ブラジルで冬時間から夏時間への切り替えを行った場合の例をご覧ください。
ZonedDateTime zdt =
ZonedDateTime.of(2015, 10, 18, 0, 30, 0, 0,
ZoneId.of("America/Sao_Paulo")); // switch to summer time
ZonedDateTime zdt1 = zdt.truncatedTo(ChronoUnit.DAYS);
ZonedDateTime zdt2 = zdt.toLocalDate().atStartOfDay(zdt.getZone());
System.out.println(zdt); // 2015-10-18T01:30-02:00[America/Sao_Paulo]
System.out.println(zdt1); // 2015-10-18T01:00-02:00[America/Sao_Paulo]
System.out.println(zdt2); // 2015-10-18T01:00-02:00[America/Sao_Paulo]
切り捨てはローカルタイムライン上で行われます。DAYSを選択した場合は、真夜中を選択することになります。によると
javadoc
は
truncate()
-メソッドに変換され、最終的に新しい
ZonedDateTime
に変換し、時間をずらした分(1時間)前に戻します。
最初にzdtを変換して
LocalDate
に変換し (時間の部分をカットして)、その
ZonedDateTime
-を探すのと、与えられたタイムゾーンの部分を探すのは、この状況では事実上同じことです。
しかし、夏時間から冬時間に戻るという逆のケースには
一つの例外
があります (反対の例を出してくれた @Austin にとても感謝します)。問題は、どのオフセットを使用するかを決定するオーバーラップ時です。通常、クラス
ZonedDateTime
は前のオフセットを使用するように設計/指定されています。
Javadoc
:
オーバーラップについて、一般的な戦略は、ローカルの日付時刻がオーバーラップの中間に位置する場合 がオーバーラップの中央に位置する場合、以前のオフセットが保持されます。 保持されます。前のオフセットがない場合、または前のオフセットが無効な場合は、以前のオフセットが使用されます。 前のオフセットがない場合、または前のオフセットが無効な場合は、以前のオフセットが使用され、通常は "summer"時間です。
もしクラス
ZonedDateTime
が結果的にそれ自身の仕様に従うのであれば、両方の手続きはまだ同等の意味となるでしょう。
zdt.truncatedTo(ChronoUnit.DAYS);
と同等でなければなりません。
zdt.toLocalDate().atStartOfDay().atZone(zdt.getZone()).withEarlierOffsetAtOverlap();
しかし、@Austin の例によると、実際の動作は、私自身のテストでも確認されています。
zdt.toLocalDate().atStartOfDay().atZone(zdt.getZone()).withLaterOffsetAtOverlap();
クラスに隠れた矛盾があるように見える
ZonedDateTime
と穏やかに話しています。どの方法がいいかと聞かれたら、私はむしろ2番目の方法を支持します。しかし、この方法には、何をするのかがより明確になるという大きな利点があります。2番目の方法を好むもう1つの理由は、次のとおりです。
ローカルタイムが一日の始まりと等しくなる最初の瞬間を本当に取得することです。そうでなければ、最初の方法を使用するとき、あなたは書かなければなりません。
zdt.truncatedTo(ChronoUnit.DAYS).withEarlierOffsetAtOverlap();
関連
-
FindBugの使用概要
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] JavaBeanとは何ですか?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
JDK8 の Optional.of と Optional.ofNullable メソッドの違いと使い方を説明する。
-
Java基礎編 - オブジェクト指向
-
テストが空であるかどうかを判断するためのオプションの処理
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ
-
[解決済み] 1日の開始時刻と終了時刻を取得する方法を教えてください。
-
[解決済み】今日の午前0時と明日の午前0時のJava日付オブジェクトを作成する方法は?