2017-12-11 19 views
2

LocalDateの2つの日数をJavaで計算するにはどうすればよいですか? 私はすべて上記2つの日付の間の日数を与えるが、どのように両方の日付を含むをカウントしている。この与えられた2つの日付を含む日数を数えてください

よう
LocalDate startDate = LocalDate.parse("2016-11-02"); 
LocalDate endDate = LocalDate.parse("2016-11-04"); 

long days = startDate.until(endDate, ChronoUnit.DAYS); 

//and 

long days= ChronoUnit.DAYS.between(startDate, endDate); 

//and 

long days= Duration.between(startDate.atStartOfDay(), endDate.atStartOfDay()).toDays(); 

を試してみました 上記の手順と同様に、2日間をnoとする。 3日を要した。あなたは文字通り24時間の日にしたい場合

+0

java.time.Durationを使用する方が良い –

+0

[2つのJava日付インスタンス間の差異の計算]の可能な複製(https://stackoverflow.com/questions/1555262/calculating-the-difference-between-two- java-date-instances) –

+1

2つの指定された日付を含みます - 1? 'Duration'にはこれを行う' plusDays'メソッドがあります。 –

答えて

2

は、あなたの代わりにDurationクラスを使用することができます。

long days = Duration.between(startDate.atStartOfDay(), endDate.atStartOfDay()).toDays() + 1; 

詳細については、Java SEの8日付と時刻に関するthis documentを参照してください。

+1

両方の日付を含めるには+1を追加する必要があると思います。 betweenは次のように定義されます: 'between(一時的な開始値、一時的なendExclusive)' – Eritrean

+0

私の答えを更新しました。ありがとう@エリトリアン –

2

The javadocは、終了日が計算に含まれていないことは明らかです。だから、単純に1を追加することができます。

long days = ChronoUnit.DAYS.between(startDate, endDate) + 1; 
1

TL; DR

包括ことから始め、時間のスパンで排他ているエンディングは当たり前です。

このアプローチには絶対に従えない場合は、追加してください。時間のスパンを定義するための

days = days + 1 ; 

ハーフオープン

共通と賢明な方法は、ハーフオープンなアプローチです。最初は)ですが、末尾は)です。

いつもとは限りませんが、私たちはこのアプローチを日常生活の中で直感的に使用します。たとえば、教室の昼食期間は午後1時から正午と言われています。つまり、すべての生徒はに戻り、の前にクラスが13:00に襲われます。クラスは午後1時から午後2時までと言われています。だから、スパンは、重なり合うことなく、そしてその時間の最後の分の無限に割り切れる最後の2分の1の最後の瞬間を決定するという厄介な仕事なしに、お互いに接することができる。

すべての日付と時刻のコーディングでは、包括的な排他的なあいまい性を解決する認知的な負荷を軽減することで、コードを読みやすく、デバッグしやすくなり、エラーを起こしにくくなります。

java.timeクラスでは、Half-Openアプローチを使用しています。

long days = ChronoUnit.DAYS.between(start , stop) ; // Half-open 

エンディングを含む結果を返さなければならない場合は、java.timeの結果に1を追加するだけです。

long daysClosed = (days + 1) ; 

曖昧さの問題へとユーザーを教育しながら、理想的には、一貫してあなたのコードにし、ユーザーインターフェイスにハーフオープンを使用します。私はビジネスマンが間違って日付範囲が開いていると仮定して無数の間違いを見てきました()[]を閉じた、または半開き[)、時には反対側の半分は(]を閉じました。

関連する問題