0

2つの日付()の差java.util.Dateをnoで計算します。非常に単純なように見える日があり、それを行うためのさまざまな方法を見つけることができます。次のコードを使用して、日付の差を計算しました。

  public static long daysBetween(Calendar startDate, Calendar endDate) {
        Calendar date = (Calendar) startDate.clone();
        long daysBetween = 0;
        while (date.before(endDate)) {
            date.add(Calendar.DAY_OF_MONTH, 1);
            daysBetween++;
        }
        return daysBetween;
    }

ではmain()、次の2つの日付を使用しました。

    Calendar c1 = Calendar.getInstance();
    c1.set(2011, 1, 1);
    Calendar c2 = Calendar.getInstance();
    c2.set(2011, 1, 31);

    long difference = daysBetween(c1, c2); // 

しかし、変数の値はdifference一貫していません。それは時々30そして時々31です。それで、なぜそれが起こったのかもしれません。

メソッドの結果に一貫した出力を使用するための解決策はありますか?

4

2 に答える 2

3

カレンダーの日付部分を設定していますが、時間部分は設定していません。

呼び出しの合間に時計が刻むgetInstance()こともあれば、刻まないこともあるため、不整合が生じます。

オプション:

  • 時間と日付を設定します(例:深夜)
  • より適切な表現を持つ、より適切な日付/時刻ライブラリ(Joda TimeLocalDate )を使用します( )。ここで重要な教訓は、あなたが持っている正確な情報を表すタイプを見つけることができ、他に何もない場合、それは適切であり、合併症を少なくする可能性が高いということです。

を使用LocalDateすると、Joda Timeはとにかく2つの値の差を計算するための優れたサポートを備えているため、ループを実行する必要はありません。

LocalDate date1 = new LocalDate(2011, 1, 1);
LocalDate date2 = new LocalDate(2011, 1, 31);
Days period = Days.daysBetween(days1, days2);
int days = period.getDays();
于 2012-08-06T13:06:46.793 に答える
2

年、月、日のみを設定します。時間、分、秒、ミリ秒は現在の時刻です(したがって、実行するたびに異なります)

代わりに、Joda TimeのLocalDateを使用することをお勧めします。これは、希望どおりに機能するように見えるためです。

于 2012-08-06T13:06:22.417 に答える