356

2 つのJoda-Time DateTimeインスタンス間の日数の違いを見つけるにはどうすればよいですか? 「日数の差」とは、開始日が月曜日で終了日が火曜日の場合、開始日と終了日の時間/分/秒に関係なく、戻り値が 1 になることを意味します。

Days.daysBetween(start, end).getDays()開始が夕方で終了が朝の場合は 0 になります。

私は他の日付フィールドでも同じ問題を抱えているので、重要性の低いフィールドを「無視」する一般的な方法があることを望んでいました。

つまり、2 月から 3 月 4 日までの月も 1 になり、14:45 から 15:12 までの時間も 1 になります。ただし、14:01 と 14:55 の時差は 0 になります。

4

9 に答える 9

416

厄介なことに、 withTimeAtStartOfDay の回答は間違っていますが、たまにしかありません。あなたがしたい:

Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()

"真夜中/一日の始まり" は午前 1 時を意味する場合があり (一部の地域では夏時間はこのように行われます)、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問題全体を回避します。

于 2013-07-30T23:22:07.597 に答える
195

Daysクラス

Daysメソッドでクラスを使用するとwithTimeAtStartOfDayうまくいくはずです:

Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays() 
于 2010-09-27T10:28:51.243 に答える
90

あなたが使用することができますLocalDate:

Days.daysBetween(new LocalDate(start), new LocalDate(end)).getDays() 
于 2010-09-27T10:27:15.627 に答える
11
于 2017-08-22T04:23:48.170 に答える
2

受け入れられた答えは2つのLocalDateオブジェクトを構築しますが、大量のデータを読み取る場合は非常に高価です。私はこれを使用します:

  public static int getDaysBetween(DateTime earlier, DateTime later)
  {
    return (int) TimeUnit.MILLISECONDS.toDays(later.getMillis()- earlier.getMillis());
  }

呼び出すgetMillis()ことにより、既存の変数を使用します。
MILLISECONDS.toDays()次に、単純な算術計算を使用し、オブジェクトを作成しません。

于 2016-06-21T12:37:31.983 に答える