ジョーダタイム
依存関係の追加に関しては、java.util.Date&.Calendarが本当に悪いので、新しいプロジェクトに最初に行うのはJoda-Timeライブラリーの追加です。Java 8では、Joda-Timeに触発された新しいjava.timeパッケージを使用できます。
Joda-Timeの中核はDateTime
クラスです。java.util.Dateとは異なり、割り当てられたタイムゾーン(DateTimeZone
)を理解します。juDateから変換する場合は、ゾーンを割り当てます。
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTimeQuébec = new DateTime( date , zone );
LocalDate
2つの日時が同じ日付にあるかどうかを確認する1つの方法は、LocalDate
オブジェクトに変換することです。
その変換は、割り当てられたタイムゾーンによって異なります。LocalDate
オブジェクトを比較するには、同じゾーンで変換されている必要があります。
ここで少し実用的な方法です。
static public Boolean sameDate ( DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1 );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( dt1.getZone() ) );
Boolean match = ld1.equals( ld2 );
return match;
}
最初のDateTimeオブジェクトのタイムゾーンを使用する必要があると想定するのではなく、タイムゾーンを指定する別の引数を使用することをお勧めします。
static public Boolean sameDate ( DateTimeZone zone , DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1.withZone( zone ) );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( zone ) );
return ld1.equals( ld2 );
}
文字列表現
別のアプローチは、各日時の日付部分の文字列表現を作成し、文字列を比較することです。
繰り返しますが、割り当てられたタイムゾーンは非常に重要です。
DateTimeFormatter formatter = ISODateTimeFormat.date(); // Static method.
String s1 = formatter.print( dateTime1 );
String s2 = formatter.print( dateTime2.withZone( dt1.getZone() ) );
Boolean match = s1.equals( s2 );
return match;
一定の期間
一般的な解決策は、期間を定義し、その期間にターゲットが含まれているかどうかを確認することです。このサンプルコードはJoda-Time 2.4に含まれています。「深夜」関連のクラスは非推奨であることに注意してください。代わりにwithTimeAtStartOfDay
メソッドを使用してください。Joda-Timeは、時間間隔をさまざまな方法で表すために、間隔、期間、および期間の3つのクラスを提供します。
スパンの開始が包括的で終了が排他的である「ハーフオープン」アプローチの使用。
ターゲットのタイムゾーンは、間隔のタイムゾーンと異なる場合があります。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime target = new DateTime( 2012, 3, 4, 5, 6, 7, timeZone );
DateTime start = DateTime.now( timeZone ).withTimeAtStartOfDay();
DateTime stop = start.plusDays( 1 ).withTimeAtStartOfDay();
Interval interval = new Interval( start, stop );
boolean containsTarget = interval.contains( target );
java.time
Java 8以降には、java.timeフレームワークが付属しています。JSR 310によって定義され、ThreeTen-Extraプロジェクトによって拡張されたJoda-Timeに触発されました。チュートリアルを参照してください。
Joda-Timeのメーカーは、都合のよいときにすぐにjava.timeに移動するように私たち全員に指示しました。その間、Joda-Timeは積極的に維持されているプロジェクトとして継続します。ただし、将来の作業はJoda-Timeではなくjava.timeとThreeTen-Extraでのみ発生することを期待してください。
java.timeを要約するInstant
と…An はUTCのタイムラインの瞬間です。タイムゾーン(ZoneId
)を適用してZonedDateTime
オブジェクトを取得します。日時の漠然と不定アイデアを得るために、タイムラインをオフに移動するには、「ローカル」なクラスを使用しますLocalDateTime
、LocalDate
、LocalTime
。
この回答のJoda-Timeセクションで説明されているロジックは、java.timeに適用されます。
古いjava.util.Dateクラスには、toInstant
java.timeに変換するための新しいメソッドがあります。
Instant instant = yourJavaUtilDate.toInstant(); // Convert into java.time type.
日付を決定するにはタイムゾーンが必要です。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
そのタイムゾーンオブジェクトをに適用して、Instant
を取得しZonedDateTime
ます。そのLocalDate
目的は日付(時間、分などではなく)を比較することなので、日付のみの値(a )を抽出します。
ZonedDateTime zdt1 = ZonedDateTime.ofInstant( instant , zoneId );
LocalDate localDate1 = LocalDate.from( zdt1 );
java.util.Date
比較に必要な2番目のオブジェクトについても同じことを行います。代わりに現在の瞬間を使用します。
ZonedDateTime zdt2 = ZonedDateTime.now( zoneId );
LocalDate localDate2 = LocalDate.from( zdt2 );
特別なisEqual
メソッドを使用して、同じ日付値をテストします。
Boolean sameDate = localDate1.isEqual( localDate2 );