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
_
私の問題は、target
dateとstart
の値が同じであっても、target.isAfter(start)
がfalseであるということです。
_target >= start
_が欲しいのですが、ここでは_target > start
_のみを考慮します。
包括的にしたい。
isAfter
メソッドが排他的に一致を見つけることを意味しますか?
Joda Timeのjavadocを調べましたが、何も見つかりませんでした。
はい、isAfter
は排他的です。そうでない場合は、おそらくisEqualOrAfter
などの名前が付けられているはずです。
解決策:「後」の代わりに「前ではない」を使用し、「前」の代わりに「後ではない」を使用します。
boolean isBetweenInclusive(LocalDate start, LocalDate end, LocalDate target) {
return !target.isBefore(start) && !target.isAfter(end);
}
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
参考までに、 Joda-Time プロジェクトは現在 メンテナンスモード であり、チームは-への移行をアドバイスしています。 Java.time クラス。 Tutorial by Oracle を参照してください。
どうやらあなたは時刻ではなく日付を気にするかもしれません。その場合は、 LocalDate
クラスを使用します。
日付範囲を管理するには、 ThreeTen-Extra ライブラリをプロジェクトに追加します。これにより、 LocalDateRange
クラスにアクセスできます。
そのクラスは、比較のためにいくつかのメソッドを提供します:abuts
、 contains
、encloses
、equals
、intersection
、 isBefore
、isAfter
、isConnected
、 overlaps
、span
、および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/Montreal
、 Africa/Casablanca
、またはPacific/Auckland
。 EST
やIST
などの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
範囲クラス(LocalDateRange
&Interval
)の比較では、どちらもハーフオープンアプローチを使用しています。したがって、開始日または開始時刻が範囲に含まれているかどうかを尋ねると、true
になります。
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは厄介な古いクラスに取って代わります- legacy 日時クラス Java.util.Date
、 Calendar
、& 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に将来追加される可能性のある試験場です。 Interval
、 YearWeek
、 YearQuarter
などの便利なクラスがここにあります。 、および more 。