10

このトピックに関する多くの質問と回答を見てきましたが、特定の問題に対処したものはありませんでした。Java Calendar クラス (標準 - サード パーティ ライブラリなし) を拡張し、任意の 2 つの日付間の日数の違いを見つける必要がありました。

方法:

  1. 両方の日付の時刻を午前 0 時に変更します。
  2. 日付をミリ秒に変換します。
  3. 2 つの日付の違いを見つけます。
  4. 結果を 1 日のミリ秒数 (24 * 60 * 60 * 1000) で割ります。
  5. 結果は日数の差になるはずです。

そして、そうである場合もあれば、そうでない場合もあります。同じ日のテストでも、1つずれることがあります。どうしたの?

4

7 に答える 7

11

Joda Time Library は、このような問題に対して非常に優れたサポートを提供しています。

LocalDate d1 = new LocalDate(calendar1.getTimeInMillis());
LocalDate d2 = new LocalDate(calendar2.getTimeInMillis());
int days = Days.daysBetween(d1, d2).getDays();

更新 (@basil-bourque からのフィードバック):

Java 8 の時点で、新しい time ライブラリjava.timeが導入され、外部依存関係のない同様のオプションが利用できるようになりました。

int days = Duration.between(calendar1.toInstant(), calendar2.toInstant()).toDays();
于 2012-11-02T17:08:26.473 に答える
6

他のユーザーが示唆しているように、日付のみを比較するには、カレンダーのミリ秒値もゼロに設定する必要があります。これは、次のコード スニペットで実現できます。

someCalendar.set(Calendar.MILLISECOND, 0)

また、タイムゾーンの変更 (例: 冬時間から夏時間への移動) は、1 日が 86,400,000 ミリ秒より多いまたは少ないことを意味する場合があることに注意してください。

于 2012-11-06T20:40:36.277 に答える
2

ステップ 1 で時刻を午前 0 時に設定することで問題を認識しました。これにより、時間、分、秒がすべてゼロになるようになりました。しかし、あなたは十分に行きませんでした!また、ミリ秒もゼロ になっていることを確認する必要があります。

これを正確に行うためのコードを次に示します。

protected long truncate_to_seconds (long date_in_millis) {
    long l = date_in_millis / 1000L;
    l *= 1000L;
    return l;
} 
于 2012-11-02T15:46:17.800 に答える
1

以下のように差を計算する前に、日付から時間部分を切り捨てる必要があると思います。

   DateFormat formatter= new SimpleDateFormat("MM/dd/yyyy");
   String truncatedDateString1 = formatter.format(date1);
   Date truncatedDate1 = formatter.parse(truncatedDateString1);

   String truncatedDateString2 = formatter.format(date2);
   Date truncatedDate2 = formatter.parse(truncatedDateString2);

   long timeDifference = truncatedDate2.getTime()- truncatedDate1.getTime();

   int daysInBetween = timeDifference / (24*60*60*1000);

これがうまくいくことを願っています。

于 2012-11-02T15:57:05.657 に答える
0

私はあなたの要求に応じて私の機能を目的としています。私はカレンダーを使用していましたが、比較する前にすべての時間部分を 0 に設定しました。

    int countDays(Date dateBegin, Date dateEnd) {
    if (dateBegin == null || dateEnd == null)
        return 0;
    Calendar from = asCalendar(dateBegin); // asCalendar() Initialise a Calendar from a Date
    Calendar to = asCalendar(dateEnd);
    // Set the time part to 0
    from.set(Calendar.MILLISECOND, 0);
    from.set(Calendar.SECOND, 0);
    from.set(Calendar.MINUTE, 0);
    from.set(Calendar.HOUR_OF_DAY, 0);
    to.set(Calendar.MILLISECOND, 0);
    to.set(Calendar.SECOND, 0);
    to.set(Calendar.MINUTE, 0);
    to.set(Calendar.HOUR_OF_DAY, 0);
    int nbJours = 0;
    for (Calendar c = from ; c.before(to) ; c.add(Calendar.DATE, +1))
    {
        nbJours++;
    }
    for (Calendar c = from ; c.after(to) ; c.add(Calendar.DATE, -1))
    {
        nbJours--;
    }
    return nbJours;
    }
于 2014-08-29T06:58:47.560 に答える