web-dev-qa-db-ja.com

JodaTimeでの包括的日付範囲チェック

Joda Time2.1ライブラリを使用しています。

特定の日付がそうでない日付範囲の間にあるかどうかを比較するメソッドを作成しました。開始日と終了日に包括的にしたいと思います。時間の部分だけを日付の部分とは見なしたくないので、LocalDateを使用しました。

以下はそのためのコードです。

_isDateBetweenRange(LocalDate start,LocalDate end,LocalDate target){

       System.out.println("Start Date : "
              +start.toDateTimeAtStartOfDay(DateTimeZone.forID("EST"));

       System.out.println("Target Date : "
              +targettoDateTimeAtStartOfDay(DateTimeZone.forID("EST"));

       System.out.println("End Date : "
              +end.toDateTimeAtStartOfDay(DateTimeZone.forID("EST"));

       System.out.println(target.isAfter(start));

       System.out.println(target.isBefore(end));
}
_

上記のメソッドの出力は次のとおりです。

_Start Date: 2012-11-20T00:00:00.000-05:00
Target Date: 2012-11-20T00:00:00.000-05:00
End Date : 2012-11-21T00:00:00.000-05:00
target.isAfter(start) : false
target.isBefore(end) : true
_

私の問題は、targetdateとstartの値が同じであっても、target.isAfter(start)がfalseであるということです。

_target >= start_が欲しいのですが、ここでは_target > start_のみを考慮します。
包括的にしたい。

isAfterメソッドが排他的に一致を見つけることを意味しますか?

Joda Timeのjavadocを調べましたが、何も見つかりませんでした。

23
Abubakkar

はい、isAfterは排他的です。そうでない場合は、おそらくisEqualOrAfterなどの名前が付けられているはずです。

解決策:「後」の代わりに「前ではない」を使用し、「前」の代わりに「後ではない」を使用します。

boolean isBetweenInclusive(LocalDate start, LocalDate end, LocalDate target) {
    return !target.isBefore(start) && !target.isAfter(end);
}
52
Jesper

tl; dr

Joda-Timeは、Java.timeクラスとThreeTen-Extraプロジェクトに取って代わられました。

期間を表すLocalDateRangeクラスとIntervalクラスは、Half-Open定義を使用します。したがって、先頭が含まれているかどうかを尋ねると、trueが返されます。

LocalDateRange.of(                     // `org.threeten.extra.LocalDateRange` class represents a pair of `LocalDate` objects as a date range.
    LocalDate.of( 2018, 8 , 2 ) ,      // `Java.time.LocalDate` class represents a date-only value, without time-of-day and without time zone.
    LocalDate.of( 2018 , 8 , 20 ) 
)                                      // Returns a `LocalDateRange` object.
.contains(
    LocalDate.now()                    // Capture the current date as seen in the wall-clock time used by the people of the JVM’s current default time zone.
)

true

Java.time

参考までに、 Joda-Time プロジェクトは現在 メンテナンスモード であり、チームは-への移行をアドバイスしています。 Java.time クラス。 Tutorial by Oracle を参照してください。

日付のみ

どうやらあなたは時刻ではなく日付を気にするかもしれません。その場合は、 LocalDate クラスを使用します。

日付範囲を管理するには、 ThreeTen-Extra ライブラリをプロジェクトに追加します。これにより、 LocalDateRange クラスにアクセスできます。

そのクラスは、比較のためにいくつかのメソッドを提供します:abutscontainsenclosesequalsintersectionisBeforeisAfterisConnectedoverlapsspan、およびunion

LocalDateRange r = 
    LocalDateRange.of( 
        LocalDate.of( 2018, 8 , 2 ) , 
        LocalDate.of( 2018 , 8 , 20 ) 
    ) 
;

LocalDate target = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;  // Capture the current date as seen in the wall-clock time used by the people of a particular time zone.
boolean contains = r.contains( target ) ;

日付時刻

特定のタイムゾーンの日付と時刻が気になる場合は、ZonedDateTimeクラスを使用してください。

LocalDateから始めて、そのクラスに1日の最初の瞬間を決定させます。notは、夏時間(DST)などの異常のため、常に00:00:00に開始します。 /。

適切なタイムゾーン名continent/regionの形式で指定します。たとえば、 America/MontrealAfrica/Casablanca 、またはPacific/AucklandESTISTなどの3〜4文字の省略形は、not真のタイムゾーンであり、標準化されておらず、ユニーク(!)ですら。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  // Or "America/New_York", etc.
ZonedDateTime zdtStart = LocalDate.of( 2018, 8 , 2 ).atStartOfDay( z ) ;
ZonedDateTime zdtStop = LocalDate.of( 2018, 8 , 20 ).atStartOfDay( z ) ;
ZonedDateTime zdtTarget = ZonedDateTime.now( z ) ;

ThreeTen-ExtraからのIntervalで範囲を表します。このクラスは、Instantオブジェクトのペアを表します。 InstantはUTCの瞬間であり、常にUTCです。 Instantを抽出するだけで、ゾーニングされた瞬間からUTCに簡単に調整できます。同じ瞬間、タイムライン上の同じポイント、異なる実時間。

Instant instantStart = zdtStart.toInstant() ;
Instant instantStop = zdtStop.toInstant() ;
Instant instantTarget = zdtTarget.toInstant() ;

Interval interval = Interval.of( instantStart , intervalStop ) ;
boolean contains = interval.contains( instantTarget ) ;

半開き

期間を定義するための最良のアプローチは、一般的にHalf-Openアプローチです。これは、開始がincludeであり、終了がExclusiveであることを意味します。

上記のThreeTen-Extra範囲クラス(LocalDateRangeInterval)の比較では、どちらもハーフオープンアプローチを使用しています。したがって、開始日または開始時刻が範囲に含まれているかどうかを尋ねると、trueになります。


Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは厄介な古いクラスに取って代わります- legacy 日時クラス Java.util.DateCalendar 、& SimpleDateFormat

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.timeへの移行をアドバイスします。 クラス。

詳細については、 Oracle Tutorial を参照してください。そして、StackOverflowで多くの例と説明を検索してください。仕様は JSR 31 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBCドライバー に準拠 JDBC 4.2 以降を使用します。文字列やJava.sql.*クラスは必要ありません。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある試験場です。 IntervalYearWeekYearQuarter などの便利なクラスがここにあります。 、および more

1
Basil Bourque