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
がある場合、推奨される使用例は何ですか?
DateMidnight
を使用する正当な理由はありません。 LocalDate
がより良いオプションです。これは、特定のタイムゾーンで深夜が1年に1回発生しないため、クラスの使いやすさが完全に台無しになり、アプリケーションにバグが発生するためです。
コンストラクターは最悪の問題を回避するために修正されましたが、01:00を指す内部ミリ秒値を持つDateMidnight
オブジェクトを見るのは正確ではありません。
new DateTime(). withTimeAtStartOfDay() が推奨されます。
または、LocalDate
メソッド toDateTimeAtStartOfDay
を直接使用してDateTime
オブジェクトの作成をバイパスします( 上記の回答 に関連して) 。
new LocalDate().toDateTimeAtStartOfDay( myDateTimeZone )
ここでは、dateTimeが真夜中に発生するかどうかを確認するより単純なソリューション現地時間
private boolean isAtMidnight(org.joda.time.DateTime dateTime) {
return dateTime.toLocalDateTime().getMillisOfDay() == 0;
}
私のコードにあった例外を見てください
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()を使用して同様の例外を回避することです。
回答を自由に編集してください