Javaの2つの日付の日数の違いは?


81

2つの日付の間の日数を見つける必要があります。1つはレポートからのもので、もう1つは現在の日付です。私のスニペット:

  int age=calculateDifference(agingDate, today);

ここではcalculateDifferenceプライベートメソッドである、agingDatetodayしているDateだけで、あなたの明確化のために、オブジェクト。Javaフォーラムの2つの記事、スレッド1 /スレッド2をフォローしました。

スタンドアロンプ​​ログラムでは正常に機能しますが、これをロジックに含めてレポートから読み取ると、値に異常な違いが生じます。

なぜそれが起こっているのですか、どうすれば修正できますか?

編集:

実際の日数と比較して、日数が増えています。

public static int calculateDifference(Date a, Date b)
{
    int tempDifference = 0;
    int difference = 0;
    Calendar earlier = Calendar.getInstance();
    Calendar later = Calendar.getInstance();

    if (a.compareTo(b) < 0)
    {
        earlier.setTime(a);
        later.setTime(b);
    }
    else
    {
        earlier.setTime(b);
        later.setTime(a);
    }

    while (earlier.get(Calendar.YEAR) != later.get(Calendar.YEAR))
    {
        tempDifference = 365 * (later.get(Calendar.YEAR) - earlier.get(Calendar.YEAR));
        difference += tempDifference;

        earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
    }

    if (earlier.get(Calendar.DAY_OF_YEAR) != later.get(Calendar.DAY_OF_YEAR))
    {
        tempDifference = later.get(Calendar.DAY_OF_YEAR) - earlier.get(Calendar.DAY_OF_YEAR);
        difference += tempDifference;

        earlier.add(Calendar.DAY_OF_YEAR, tempDifference);
    }

    return difference;
}

注意 :

残念ながら、どの答えも私が問題を解決するのに役立ちませんでした。私はJoda-timeライブラリの助けを借りてこの問題を達成しました。


3
異常な差の値とはどういう意味ですか?もっと明確にしてください、またはある種の例を挙げてください。
Marcel Gheorghita

1
calculateDifferenceメソッドのコードを投稿できますか?
Eugene Ryzhikov 2010

FYI、といった面倒な古い日付時刻クラスjava.util.Datejava.util.Calendarjava.text.SimpleDateFormat今のレガシーに取って代わられ、java.timeのクラス。Oracleによるチュートリアルを参照してください。同様に、Joda-Timeプロジェクトは現在メンテナンスモードにあり、チームはjava.timeクラスへの移行をアドバイスしています。
バジルバーク2017年

回答:


149

欠陥のあるjava.util.Dateやその仲間の代わりに、優れたJodaTimeライブラリを使用することをお勧めします。あなたは単に書くことができます

import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.Days;

Date past = new Date(110, 5, 20); // June 20th, 2010
Date today = new Date(110, 6, 24); // July 24th 
int days = Days.daysBetween(new DateTime(past), new DateTime(today)).getDays(); // => 34

3
joda-time.sourceforge.net/faq.html#datediff-私は同じことを提案しようとしていました。
ネブリル2010

2
jodaInstance = new DateTime(jdkDate); joda timeとjava.util.Dateおよびその仲間との間の変換については、joda-time.sourceforge.net / userguide.html#JDK_Interoperability
Adam Schmideg 2010

2
@ vencoder-jodatimeの使用に関する別の質問として投稿できると思います。一見間違った結果をもたらすコードスニペットを提供することもできます。
Adam Schmideg 2010

2
@ vencoder-サンプルコードを更新しました。これでうまくいきます。この質問に答えたのがわかります。ここまたは別の質問で、機能しないコードを表示します。
Adam Schmideg 2010

1
FYI、ジョダタイムプロジェクトは、今でメンテナンスモードへの移行を助言チームと、java.timeのクラス。Oracleによるチュートリアルを参照してください。
バジルバーク2017年

48

ゲームに参加するには遅すぎるかもしれませんが、一体何ですか?:)

これはスレッドの問題だと思いますか?たとえば、このメソッドの出力をどのように使用していますか?または

次のような単純なことを行うようにコードを変更できますか?

Calendar calendar1 = Calendar.getInstance();
    Calendar calendar2 = Calendar.getInstance();
    calendar1.set(<your earlier date>);
    calendar2.set(<your current date>);
    long milliseconds1 = calendar1.getTimeInMillis();
    long milliseconds2 = calendar2.getTimeInMillis();
    long diff = milliseconds2 - milliseconds1;
    long diffSeconds = diff / 1000;
    long diffMinutes = diff / (60 * 1000);
    long diffHours = diff / (60 * 60 * 1000);
    long diffDays = diff / (24 * 60 * 60 * 1000);
    System.out.println("\nThe Date Different Example");
    System.out.println("Time in milliseconds: " + diff
 + " milliseconds.");
    System.out.println("Time in seconds: " + diffSeconds
 + " seconds.");
    System.out.println("Time in minutes: " + diffMinutes 
+ " minutes.");
    System.out.println("Time in hours: " + diffHours 
+ " hours.");
    System.out.println("Time in days: " + diffDays 
+ " days.");
  }

18
このコードは夏時間に注意を払っていないため、日数の違いの結果が正しくない可能性があります。
ヨハンナ

@Johannaかなり遅いですが、失敗したときの例を教えてください。私はたくさん試しましたが、これが失敗する日付範囲を見つけることができませんでした。ありがとうございました。
abhilash 2014

4
このエラーは、中央ヨーロッパ時間、ベルリン、パリ、アムステルダムなど、夏時間を使用するタイムゾーン(ローカルタイムゾーン設定)にいる場合にのみ発生します。夏時間の開始日と終了日は24時間ではありません。たとえば、2014年3月30日は23時間しかありませんでしたが、2014年10月26日は25時間です。前の日付が3月30日2:00より前で、後の日付が3月30日3:00より後の場合、計算は失敗します。
ヨハンナ

23

diff /(24 *など)はタイムゾーンを考慮しないため、デフォルトのタイムゾーンにDSTが含まれていると、計算が遅れる可能性があります。

このリンクには、ちょっとした実装があります。

リンクがダウンした場合の上記のリンクのソースは次のとおりです。

/** Using Calendar - THE CORRECT WAY**/  
public static long daysBetween(Calendar startDate, Calendar endDate) {  
  //assert: startDate must be before endDate  
  Calendar date = (Calendar) startDate.clone();  
  long daysBetween = 0;  
  while (date.before(endDate)) {  
    date.add(Calendar.DAY_OF_MONTH, 1);  
    daysBetween++;  
  }  
  return daysBetween;  
}  

そして

/** Using Calendar - THE CORRECT (& Faster) WAY**/  
public static long daysBetween(final Calendar startDate, final Calendar endDate)
{
  //assert: startDate must be before endDate  
  int MILLIS_IN_DAY = 1000 * 60 * 60 * 24;  
  long endInstant = endDate.getTimeInMillis();  
  int presumedDays = 
    (int) ((endInstant - startDate.getTimeInMillis()) / MILLIS_IN_DAY);  
  Calendar cursor = (Calendar) startDate.clone();  
  cursor.add(Calendar.DAY_OF_YEAR, presumedDays);  
  long instant = cursor.getTimeInMillis();  
  if (instant == endInstant)  
    return presumedDays;

  final int step = instant < endInstant ? 1 : -1;  
  do {  
    cursor.add(Calendar.DAY_OF_MONTH, step);  
    presumedDays += step;  
  } while (cursor.getTimeInMillis() != endInstant);  
  return presumedDays;  
}

4
2番目の方法は間違っています、最後whileはそうあるべきです。while (cursor.getTimeInMillis() <= endInstant); それ以外の場合は、1日未満の場合、無限ループが発生します。
Chris.Jenkins 2013

リンクのコメントから「与えられたアルゴリズムはあなたが期待するよりも「1日多く」を与えるかもしれないことに注意する必要があります。それは2009-02-2819:00:00と2009-02-28の間の日数として1を与えます19:00:01」
zyoo 2015年

16

java.time

Java 8以降では、java.timeフレームワークチュートリアル)を使用します。

Duration

このDurationクラスは、時間のスパンを秒数と小数秒で表します。日、時間、分、秒を数えることができます。

ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime oldDate = now.minusDays(1).minusMinutes(10);
Duration duration = Duration.between(oldDate, now);
System.out.println(duration.toDays());

ChronoUnit

必要なのが日数だけの場合は、代わりに列挙型を使用できます。計算メソッドがではなくを返すことに注意してください。ChronoUnit longint

long days = ChronoUnit.DAYS.between( then, now );

また、日付をChronoUnit.DAYS.betweenに正しい順序で渡すようにしてください。そうしないと、-veの結果が返されます
RRR_J 2016年

13
import java.util.Calendar;
import java.util.Date;

public class Main {
    public static long calculateDays(String startDate, String endDate)
    {
        Date sDate = new Date(startDate);
        Date eDate = new Date(endDate);
        Calendar cal3 = Calendar.getInstance();
        cal3.setTime(sDate);
        Calendar cal4 = Calendar.getInstance();
        cal4.setTime(eDate);
        return daysBetween(cal3, cal4);
    }

    public static void main(String[] args) {
        System.out.println(calculateDays("2012/03/31", "2012/06/17"));

    }

    /** Using Calendar - THE CORRECT WAY**/
    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;
    }
}

1
ループは優れたアイデアではありません。同じことを行うためのより簡単なオプションがある場合、パフォーマンスはどうですか?
angelcervera 2013

1
パフォーマンスの向上は、2の累乗でインクリメントし、条件date.before(endDate)がfalseの場合、前の反復に戻り、インクリメントを1にリセットすることです。つまり、10億日離れている場合は、おそらく10億ではなく30回の反復を行うでしょう。ミリ秒をチェックして推測することでパフォーマンスを向上させることもできますが、それはおそらくあまりエレガントではありません。
muhd 2013年

12

それはあなたが違いとして何を定義するかに依存します。真夜中の2つの日付を比較するには、次のことができます。

long day1 = ...; // in milliseconds.
long day2 = ...; // in milliseconds.
long days = (day2 - day1) / 86400000;

9
このコードは夏時間に注意を払っていないため、結果が正しくない可能性があります。
ヨハンナ

@JohannaこのソリューションはDSTで機能します。除算後にラウンドが適用される場合、この差は無視され、結果は問題ありません。
angelcervera 2013

1
@angelcerveraほとんどの場合、それは正しいでしょうが、それが近い場合、余分な時間は精度を+/- 1日オフにする可能性があります(つまり、間違った方向に丸められます)。
muhd 2013年

3
@Muhdはい、その通りです。3行目は次のようになります。longdays= Math.round((day2-day1)/ 86400000D); 除数が2倍の値であることが非常に重要です。
angelcervera 2013年

3
ごめんなさい。今朝、1年生の数学モジュールを脳に接続するのを忘れました。マイナスを引くと計算がうまくいかないと思っていました。コメントに反対票を投じることができるはずです。
snekse 2013年

9

ミリ秒時間の差を使用し、DST日付を正しく丸めるソリューション:

public static long daysDiff(Date from, Date to) {
    return daysDiff(from.getTime(), to.getTime());
}

public static long daysDiff(long from, long to) {
    return Math.round( (to - from) / 86400000D ); // 1000 * 60 * 60 * 24
}

注:もちろん、日付は特定のタイムゾーンである必要があります。

重要なコード:

Math.round( (to - from) / 86400000D )

丸めたくない場合は、UTC日付を使用できます。


1
@marcolopesいいえ、32を返します。System.out.println(daysDiff(new Date(2014、2、1)、new Date(2014、3、2))); 1月は0であるので、注意してください
angelcervera

4

問題の説明:(私のコードは数週間でデルタを計算していますが、同じ問題が数日でデルタに当てはまります)

これは非常に合理的に見える実装です:

public static final long MILLIS_PER_WEEK = 7L * 24L * 60L * 60L * 1000L;

static public int getDeltaInWeeks(Date latterDate, Date earlierDate) {
    long deltaInMillis = latterDate.getTime() - earlierDate.getTime();
    int deltaInWeeks = (int)(deltaInMillis / MILLIS_PER_WEEK);
    return deltaInWeeks; 
}

しかし、このテストは失敗します:

public void testGetDeltaInWeeks() {
    delta = AggregatedData.getDeltaInWeeks(dateMar09, dateFeb23);
    assertEquals("weeks between Feb23 and Mar09", 2, delta);
}

その理由は:

Mon Mar 09 00:00:00 EDT 2009 = 1,236,571,200,000
Mon Feb 23 00:00:00 EST 2009 = 1,235,365,200,000
MillisPerWeek = 604,800,000
したがって、
(Mar09- 2月23日)/ MillisPerWeek =
1,206,000,000 / 604,800,000 = 1.994 .. ..

しかし、カレンダーを見ている人は誰でも答えが2であることに同意するでしょう。


1
EDTESTに注意してください。あなたは夏時間を見ています。週に168時間(春に1時間を「獲得」する場合は+1)* 2週間、追加のDST時間を追加すると、335/168 = 1.9940476190になります。
jpswain 2011年

3

私はこの関数を使用します:

DATEDIFF("31/01/2016", "01/03/2016") // me return 30 days

私の機能:

import java.util.Date;

public long DATEDIFF(String date1, String date2) {
        long MILLISECS_PER_DAY = 24 * 60 * 60 * 1000;
        long days = 0l;
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); // "dd/MM/yyyy HH:mm:ss");

        Date dateIni = null;
        Date dateFin = null;        
        try {       
            dateIni = (Date) format.parse(date1);
            dateFin = (Date) format.parse(date2);
            days = (dateFin.getTime() - dateIni.getTime())/MILLISECS_PER_DAY;                        
        } catch (Exception e) {  e.printStackTrace();  }   

        return days; 
     }


2

@Mad_Trollの回答に基づいて、私はこのメソッドを開発しました。

私はそれに対して約30のテストケースを実行しましたが、サブデイタイムフラグメントを正しく処理する唯一の方法です。

例:今と今を通過した場合+1ミリ秒はまだ同じ日です。こう1-1-13 23:59:59.0981-1-13 23:59:59.099正しく、0日を返します。ここに掲載されている他の方法の割り当ては、これを正しく行いません。

注目に値するのは、どちらの方向に配置してもかまわないことです。終了日が開始日より前の場合は、逆方向にカウントされます。

/**
 * This is not quick but if only doing a few days backwards/forwards then it is very accurate.
 *
 * @param startDate from
 * @param endDate   to
 * @return day count between the two dates, this can be negative if startDate is after endDate
 */
public static long daysBetween(@NotNull final Calendar startDate, @NotNull final Calendar endDate) {

    //Forwards or backwards?
    final boolean forward = startDate.before(endDate);
    // Which direction are we going
    final int multiplier = forward ? 1 : -1;

    // The date we are going to move.
    final Calendar date = (Calendar) startDate.clone();

    // Result
    long daysBetween = 0;

    // Start at millis (then bump up until we go back a day)
    int fieldAccuracy = 4;
    int field;
    int dayBefore, dayAfter;
    while (forward && date.before(endDate) || !forward && endDate.before(date)) {
        // We start moving slowly if no change then we decrease accuracy.
        switch (fieldAccuracy) {
            case 4:
                field = Calendar.MILLISECOND;
                break;
            case 3:
                field = Calendar.SECOND;
                break;
            case 2:
                field = Calendar.MINUTE;
                break;
            case 1:
                field = Calendar.HOUR_OF_DAY;
                break;
            default:
            case 0:
                field = Calendar.DAY_OF_MONTH;
                break;
        }
        // Get the day before we move the time, Change, then get the day after.
        dayBefore = date.get(Calendar.DAY_OF_MONTH);
        date.add(field, multiplier);
        dayAfter = date.get(Calendar.DAY_OF_MONTH);

        // This shifts lining up the dates, one field at a time.
        if (dayBefore == dayAfter && date.get(field) == endDate.get(field))
            fieldAccuracy--;
        // If day has changed after moving at any accuracy level we bump the day counter.
        if (dayBefore != dayAfter) {
            daysBetween += multiplier;
        }
    }
    return daysBetween;
}

@NotNull注釈は削除できます。これらはIntellijがその場でコード分析を行うために使用します


私はミリスを考慮に入れていますが、その計算機はそうではありません。数値を0に切り捨てると仮定しています。答えの上部で述べたように。時間/分/秒/ミリを平らにすると、正しくカウントされることがわかります。
Chris.Jenkins 2014

1

「スタンドアロンプ​​ログラムでは問題なく動作する」とおっしゃっていますが、「これをロジックに組み込んでレポートから読み取る」と、「異常な差の値」が発生します。これは、レポートに正しく機能しない値がいくつかあり、スタンドアロンプ​​ログラムにそれらの値がないことを示しています。スタンドアロンプ​​ログラムの代わりに、テストケースをお勧めします。JUnitのTestCaseクラスからサブクラス化して、スタンドアロンプ​​ログラムと同じようにテストケースを記述します。これで、非常に具体的な例を実行して、期待する値を知ることができます(そして、今日は時間とともに変化するため、テスト値として今日は与えないでください)。スタンドアロンプ​​ログラムで使用した値を入力すると、テストに合格する可能性があります。それは素晴らしいことです-あなたはそれらのケースが機能し続けることを望みます。次に、レポートから値を追加します。正しく動作します。新しいテストはおそらく失敗します。失敗する理由を理解し、修正して、グリーンになります(すべてのテストに合格)。レポートを実行します。まだ壊れているものを見てください。テストを書く。合格させます。すぐに、レポートが機能していることがわかります。


1

この基本機能の100行のコード???

簡単な方法:

protected static int calculateDayDifference(Date dateAfter, Date dateBefore){
    return (int)(dateAfter.getTime()-dateBefore.getTime())/(1000 * 60 * 60 * 24); 
    // MILLIS_IN_DAY = 1000 * 60 * 60 * 24;
}

5
タイムゾーンを無視します。夏時間やその他の異常を無視します。部分的な日の丸めを無視します。
バジルバーク2014

1
public static int getDifferenceIndays(long timestamp1, long timestamp2) {
    final int SECONDS = 60;
    final int MINUTES = 60;
    final int HOURS = 24;
    final int MILLIES = 1000;
    long temp;
    if (timestamp1 < timestamp2) {
        temp = timestamp1;
        timestamp1 = timestamp2;
        timestamp2 = temp;
    }
    Calendar startDate = Calendar.getInstance(TimeZone.getDefault());
    Calendar endDate = Calendar.getInstance(TimeZone.getDefault());
    endDate.setTimeInMillis(timestamp1);
    startDate.setTimeInMillis(timestamp2);
    if ((timestamp1 - timestamp2) < 1 * HOURS * MINUTES * SECONDS * MILLIES) {
        int day1 = endDate.get(Calendar.DAY_OF_MONTH);
        int day2 = startDate.get(Calendar.DAY_OF_MONTH);
        if (day1 == day2) {
            return 0;
        } else {
            return 1;
        }
    }
    int diffDays = 0;
    startDate.add(Calendar.DAY_OF_MONTH, diffDays);
    while (startDate.before(endDate)) {
        startDate.add(Calendar.DAY_OF_MONTH, 1);
        diffDays++;
    }
    return diffDays;
}

1

ThreeTen-追加

Vitalii Fedorenkoによる回答と近代的な方法でこの計算を実行する方法を記述し、正しいjava.timeのクラス(DurationChronoUnit)は、Java 8に内蔵され、後(及びJavaの6&7に戻って、移植及びAndroidのに)。

Days

コードで日常的に日数を使用している場合は、クラスを使用して単なる整数を置き換えることができます。このDaysクラスは、java.timeの拡張であり、java.timeへの将来の追加の可能性を証明するThreeTen-Extraプロジェクトにあります。このDaysクラスは、アプリケーションの日数を表すタイプセーフな方法を提供します。このクラスには、との便利な定数が含まれZEROていONEます。

java.util.Date質問の古い時代遅れのオブジェクトを前提として、最初にそれらを最新のjava.time.Instantオブジェクトに変換します。古い日時クラスには、java.timeへの変換を容易にするメソッドが新たに追加されていますjava.util.Date::toInstant

Instant start = utilDateStart.toInstant(); // Inclusive.
Instant stop = utilDateStop.toInstant();  // Exclusive.

両方のInstantオブジェクトをのファクトリメソッドに渡しますorg.threeten.extra.Days

現在の実装(2016-06)では、これはラッパー呼び出しです。詳細についてはjava.time.temporal.ChronoUnit.DAYS.betweenChronoUnitクラスのドキュメントをお読みください。明確にするために:initial-capはThreeTen-Extraのクラスですが、すべて大文字DAYSは列挙型です。ChronoUnitDays

Days days = Days.between( start , stop );

これらのDaysオブジェクトを独自のコードに渡すことができます。を呼び出すことにより、標準のISO8601形式の文字列にシリアル化できますtoString。この形式でPnDは、aPを使用して開始をマークし、D「日」を意味し、その間に日数があります。java.timeクラスとThreeTen-Extraはどちらも、日時値を表す文字列を生成および解析するときに、デフォルトでこれらの標準形式を使用します。

String output = days.toString();

P3D

Days days = Days.parse( "P3D" );  

0

このコードは、2つの日付文字列間の日数を計算します。

    static final long MILLI_SECONDS_IN_A_DAY = 1000 * 60 * 60 * 24;
    static final String DATE_FORMAT = "dd-MM-yyyy";
    public long daysBetween(String fromDateStr, String toDateStr) throws ParseException {
    SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT);
    Date fromDate;
    Date toDate;
    fromDate = format.parse(fromDateStr);
    toDate = format.parse(toDateStr);
    return (toDate.getTime() - fromDate.getTime()) / MILLI_SECONDS_IN_A_DAY;
}

0

たとえば11/30/2014 23:5912/01/2014 00:01Joda Timeを使用したソリューションとの間で、適切な数または日数を返すソリューションを探している場合。

private int getDayDifference(long past, long current) {
    DateTime currentDate = new DateTime(current);
    DateTime pastDate = new DateTime(past);
    return currentDate.getDayOfYear() - pastDate.getDayOfYear();
} 

この実装は1、日数の差として返されます。ここに掲載されているソリューションのほとんどは、2つの日付間のミリ秒単位の差を計算します。これは、0これら2つの日付の差が2分しかないため、返されることを意味します。


0

Java Util Dateが間違った値を返すことがあるため、JodaTimeライブラリを使用する必要があります。

JodaとJavaの使用日

たとえば、昨日(dd-mm-yyyy、2016年12月7日)から1957年の最初の日(dd-mm-yyyy、1957年1月1日)までの日数:

public class Main {

public static void main(String[] args) {
    SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");

    Date date = null;
    try {
        date = format.parse("12-07-2016");
    } catch (ParseException e) {
        e.printStackTrace();
    }

    //Try with Joda - prints 21742
    System.out.println("This is correct: " + getDaysBetweenDatesWithJodaFromYear1957(date));
    //Try with Java util - prints 21741
    System.out.println("This is not correct: " + getDaysBetweenDatesWithJavaUtilFromYear1957(date));    
}


private static int getDaysBetweenDatesWithJodaFromYear1957(Date date) {
    DateTime jodaDateTime = new DateTime(date);
    DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-yyyy");
    DateTime y1957 = formatter.parseDateTime("01-01-1957");

    return Days.daysBetween(y1957 , jodaDateTime).getDays();
}

private static long getDaysBetweenDatesWithJavaUtilFromYear1957(Date date) {
    SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");

    Date y1957 = null;
    try {
        y1957 = format.parse("01-01-1957");
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return TimeUnit.DAYS.convert(date.getTime() - y1957.getTime(), TimeUnit.MILLISECONDS);
}

ですから、JodaTimeライブラリを使用することをお勧めします。


1
一方、FYI、ジョダタイムはまだ積極的にサポートされ、その開発チームはへの移行をアドバイスjava.time。ホームページから引用すると、「Joda-Timeは、Java SE 8より前のJavaのデファクトスタンダードの日付と時刻のライブラリです。ユーザーは、java.time(JSR-310)に移行するように求められます。」
バジルバーク2016

-6

私はこのようにしました。それは簡単です :)

Date d1 = jDateChooserFrom.getDate();
Date d2 = jDateChooserTo.getDate();

Calendar day1 = Calendar.getInstance();
day1.setTime(d1);

Calendar day2 = Calendar.getInstance();
day2.setTime(d2);

int from = day1.get(Calendar.DAY_OF_YEAR);
int to = day2.get(Calendar.DAY_OF_YEAR);

int difference = to-from;

4
これについていくつかのテストを行ってください。これが機能しないことがすぐにわかります。2013年12月31日から2014年1月1日まで、それは1日の違いでしょうか?あなたの計算は、1-365 = -364を行います。これは間違いなく正しくありません。
Chris.Jenkins 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.