tl; dr
java.time.temporal.ChronoUnit.DAYS.between(
earlier.toLocalDate(),
later.toLocalDate()
)
…または…
java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo( ChronoUnit.HOURS ) ,
later.truncatedTo( ChronoUnit.HOURS )
)
java.time
参考までに、Joda-Timeプロジェクトは現在メンテナンスモードにあり、チームは java.timeのクラス。
Joda-Timeに相当するものDateTime
はZonedDateTime
です。
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
どうやらあなたは日付で日を数えたい、つまりあなたは時刻を無視したいのです。たとえば、午前0時の1分前に開始し、午前0時の1分後に終了すると、1日になります。この動作では、LocalDate
からを抽出しますZonedDateTime
。このLocalDate
クラスは、時刻とタイムゾーンなしの日付のみの値を表します。
LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;
ChronoUnit
enumを使用して、経過日数またはその他の単位を計算します。
long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;
切り捨て
このカウントを行うより一般的な方法について、60分の時間範囲としての完全な時間ではなく、時間単位の時間としての時間のデルタに関心がある場合、truncatedTo
メソッドを使用します。
これは、同じ日の14:45から15:12の例です。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );
long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );
1
これは数日間機能しません。この場合はtoLocalDate()を使用します。
java.timeについて
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.Date
、Calendar
、& SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
Days.daysBetween
間違っていると思われる具体的なデータの事例を提供できますか?