2016-08-30 11 views
1

2つの日付(日付またはカレンダーオブジェクト)の間の日数を計算するには、計算の終了日も考慮してください。私は方法の下に使用Javaの日計算ロジックの終了日も考慮してください

Date d1 = new Date(); // 30-08-2016 
Calendar c= Calendar.getInstance(); 
c.add(Calendar.YEAR, 2016); 
c.add(Calendar.MONTH, Calendar.AUGUST); 
c.add(Calendar.DAY_OF_MONTH, 31)// 31-08-2016 
Date d2 = c.getTime(); 

daysBetween(D2、D1)例えば

public static int daysBetween(Date d1, Date d2) {  
return Days.daysBetween(new LocalDate(d1.getTime()), new LocalDate(d2.getTime())).getDays();  
} 

メソッドが返す「1」が、私は検討する必要があるので、私は「2」としたい終了日も、それはその要件については30と31

を意味私は、そのメソッドが返すものは何でも1または前を追加することができます値も返します。これは、問題を解決する正しい方法ではなく、うるう年の日付も考慮する必要があります。

問題を解決するのを手伝ってください。

+0

*あなたが何を求めているのかの技術用語は、Half-Openです。ここで、時間の長さは*包含*で始まり、*は排他*です。 *あなたが求めているのは、「終わり」と「終わり」の両方が含まれていることです。ハーフオープンアプローチは一般的に使用され、より賢明で実用的です。一貫して使用すると、Half-Openは日時処理ロジックをよりクリーンに、より明確に、より簡単にします。要件で閉鎖された数が必要な場合は、単純に1を追加することが正しい解決策になります。ただし、おそらくゼロカウント(要件に熟考して解決する必要があります)を除きます。 –

+0

@BasilBourque一般に、ハーフオープンは、潜在的により正確な単位が実際に使用される可能性のある間隔を処理するのに役立ちますが、日付単位では単位が一番小さい単位であるため状況が異なります。銀行や保証の分野ではいつものように、この分野(私のような)で働く人々は閉鎖された日付間隔を使用します(例えば、1ヶ月は閉じられた範囲[2016-08-01/2016-08-31]としてモデル化されます)。 [2016-08-01/2016-09-01]のようなものの代わりに別の月を表示しないことをお勧めします –

答えて

2

ここでは、2つの異なるライブラリ、ここではJoda-Timeとjava.util.Calendar/Dateを混在させません。代わりに、今日8月の終わりの間の日中の期間はジョダ時にこの方法で評価することができます。

Days.daysBetween(LocalDate.now(), new LocalDate(2016, 8, 31)).getDays(); // 30 

は、これは自動的にうるう日を考慮に入れて、あなたは元の日付に結果を追加したい場合は、正しいです終了日を達成する。ただし、

閉鎖された日付間隔の長さは、追加で必要な経過日数とは異なります。この場合、開始日と終了日の間の長さを決定するために1日を追加するだけです。たとえば、8月は[2016-08-31] - [2016-08-01] +1 1 = 31 - 1 +1 1 = 31日ですが、8月の初めには30日しか追加できません8月の終わり。 1日の違いは非常に自然であり、にはの長さ(閉まった間隔の)の時間が必要であるという相違のためです。

長さを達成するために期間を1日追加することについて何も間違っていません。

+0

ありがとう、私は同じことを行います。 – pandiaraj

関連する問題