web-dev-qa-db-ja.com

Joda-Time DateMidnightの推奨使用法

LocalDate#toDateMidnightのjavdocは次のようになります。

V1.5以降、DateMidnightを回避し、以下で詳述する例外のため、代わりにtoDateTimeAtStartOfDay()を使用することをお勧めします。

デフォルトのタイムゾーンが真夜中に夏時間に切り替わり、このLocalDateがその切り替え日を表す場合、このメソッドは例外をスローします。問題は、必要な日付の真夜中などの時間がないため、例外がスローされることです。

真夜中が特定のタイムゾーンに存在しないという事実は、DateMidnightの使用を完全に回避するのに十分な理由のようです(コードがこのDST状況を持たないことがわかっている固定タイムゾーンを使用していないと仮定すると、将来異なるタイムゾーンを使用してください)。

ただし、DateMidnightは非推奨ではなく、DateMidnightクラス自体のjavadocに同様の推奨事項や警告はありません。さらに、DateMidnightコンストラクターは、LocalDate#toDateMidnightのようなIllegalArgumentExceptionをスローするのではなく、特定の日に深夜0時が存在しないように、インスタントとタイムゾーンを喜んで受け入れます。結果のDateMidnightは、DateTimeのように振る舞い、時刻は1日の始まりになります。

ある日の深夜が存在しない場合、LocalDate#toDateMidnightが例外をスローし、DateMidnightコンストラクターは例外をスローしないのはなぜですか? DateMidnightがある場合、推奨される使用例は何ですか?

39
oby1

DateMidnightを使用する正当な理由はありません。 LocalDateがより良いオプションです。これは、特定のタイムゾーンで深夜が1年に1回発生しないため、クラスの使いやすさが完全に台無しになり、アプリケーションにバグが発生するためです。

コンストラクターは最悪の問題を回避するために修正されましたが、01:00を指す内部ミリ秒値を持つDateMidnightオブジェクトを見るのは正確ではありません。

45
JodaStephen

new DateTime(). withTimeAtStartOfDay() が推奨されます。

34
Jerome Anthony

または、LocalDateメソッド toDateTimeAtStartOfDay を直接使用してDateTimeオブジェクトの作成をバイパスします( 上記の回答 に関連して) 。

new LocalDate().toDateTimeAtStartOfDay( myDateTimeZone )
8
coolersport

ここでは、dateTimeが真夜中に発生するかどうかを確認するより単純なソリューション現地時間

private boolean isAtMidnight(org.joda.time.DateTime dateTime) {
   return dateTime.toLocalDateTime().getMillisOfDay() == 0;
}
0
Woody

私のコードにあった例外を見てください

Illegal instant due to time zone offset transition (daylight savings time 'gap'): 2015-03-27T00:00:00.000 (Asia/Amman)
    org.joda.time.IllegalInstantException: Illegal instant due to time zone offset transition (daylight savings time 'gap'): 2015-03-27T00:00:00.000 (Asia/Amman)

今私は使用してそれを解決しました

LocalDate currentDate=new LocalDate();
someMethodSetsTheDate(currentDate.toDateTimeAtStartOfDay().toDate());

の代わりに

someMethodSetsTheDate(new DateMidnight(date.getYear(), date.getMonthOfYear(), date.getDayOfMonth()).toDate());

現在、私の推奨事項は。toDateTimeAtStartOfDay()を使用して同様の例外を回避することです。

回答を自由に編集してください

0
shareef