2つの--- Joda-TimeDateTime
インスタンスの間の日数の違いを見つけるにはどうすればいいですか? 「日数の差」とは、開始日が月曜日で終了日が火曜日であれば、開始日と終了日の時、分、秒に関係なく、戻り値1が期待されるということです。
Days.daysBetween(start, end).getDays()
は、開始が夕方、朝が終わると0を返します。
私は他の日付フィールドについても同じ問題を抱えているので、それほど重要ではないフィールドを「無視する」一般的な方法があることを望みました。
つまり、2月から3月4日の間の月も1になり、14:45から15:12の間の時間も1になります。しかし、14:01と14:55の時差は0になります。
厄介なことに、withTimeAtStartOfDayの回答は間違っていますが、時折起こります。あなたが欲しい:
Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()
それは "真夜中/一日の始まり"が時々1amを意味することが判明します(夏時間はこのようにいくつかの場所で起こる)、Days.daysBetweenは適切に処理しません。
// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
end.toLocalDate()).getDays());
// prints 1
LocalDate
経由で進むと、問題全体が回避されます。
Days
クラスDays
クラスを withTimeAtStartOfDay
メソッドと共に使用するとうまくいくはずです。
Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays()
LocalDate
を使うことができます。
Days.daysBetween(new LocalDate(start), new LocalDate(end)).getDays()
Java.time.temporal.ChronoUnit.DAYS.between(
earlier.truncatedTo( ChronoUnit.DAYS ) ,
later.truncatedTo( ChronoUnit.DAYS )
)
…または…
Java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo( ChronoUnit.HOURS ) ,
later.truncatedTo( ChronoUnit.HOURS )
)
参考までに、 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
列挙型を使用します。
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
日付による日数の場合は、ChronoUnit.DAYS
に切り捨てます。これは、経過日数が1
の5分前から5分後まで真夜中を過ぎる例です。
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 23 , 55 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 18 , 00 , 05 , 0 , 0 , z );
long days = ChronoUnit.DAYS.between( start.truncatedTo( ChronoUnit.DAYS ) , stop.truncatedTo( ChronoUnit.DAYS ) );
1
Java.time フレームワークは、Java 8以降に組み込まれています。これらのクラスは、 Java.util.Date
、 Calendar
、& SimpleDateFormat
のような、面倒な古い レガシー 日時クラスに代わるものです。
Joda-Time プロジェクトは、現在 メンテナンスモード になっており、 Java.time クラスに移行するように勧めています。
詳細については、 Oracleチュートリアル を参照してください。そして多くの例と説明についてはStack Overflowを検索してください。指定は JSR 31 です。
データベースと直接Java.timeオブジェクトを交換することができます。 JDBC 4.2 以降に準拠した JDBCドライバー を使用してください。文字列もJava.sql.*
クラスも必要ありません。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトはJava.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 Interval
、 YearWeek
、 YearQuarter
、 more などの便利なクラスがあります。
ThreeTen-Extra プロジェクトはJava.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明するものです。 Interval
、 YearWeek
、 YearQuarter
、 more などの便利なクラスがあります。
受け入れられた答えは2つのLocalDate
オブジェクトを構築します、あなたがたくさんのデータを読んでいるならば、それらは非常に高価です。私はこれを使う:
public static int getDaysBetween(DateTime earlier, DateTime later)
{
return (int) TimeUnit.MILLISECONDS.toDays(later.getMillis()- earlier.getMillis());
}
getMillis()
を呼び出すことによって、あなたはすでに存在する変数を使います。MILLISECONDS.toDays()
は、その後、単純な算術計算を使用し、オブジェクトを作成しません。
Java.time.Period
Java.time.Period
クラスを count days に使用します。
Java 8では、LocalDate
を使用して差を計算する方がより直感的です。2つの日付を表すのにLocalDateTime
LocalDate now = LocalDate.now();
LocalDate inputDate = LocalDate.of(2018, 11, 28);
Period period = Period.between( inputDate, now);
int diff = period.getDays();
System.out.println("diff = " + diff);
DateTime dt = new DateTime(laterDate);
DateTime newDate = dt.minus( new DateTime ( previousDate ).getMillis());
System.out.println("No of days : " + newDate.getDayOfYear() - 1 );