Javaで期間の日数を計算する #java

概要

2016年1月7日から2017年4月27日みたいな期間の日数を数える方法。

Period…惜しい

日付の期間を扱うには java.time.Period クラスがあるが、悲しいことに日数をカウントするAPIがない。

getDays() は日付だけで計算をするため、月をまたいだ日数のカウントにはならない。

Period period = Period.between(LocalDate.of(2017, 1, 1), LocalDate.of(2017, 2, 1));
int count = period.getDays(); 
System.out.println(count); // 31ではなく、0が返ってくる

ちなみに月は getMonths() とは別に期間の合計月数を取得できる toTotalMonths() がある。

なぜ toTotalDays() はないのだ。。

Durationならいける

時間ベースの期間を表す java.time.Duration クラスであれば、日数をカウントできる。

Duration duration = Duration.between(LocalDate.of(2017, 1, 1).atTime(0, 0, 0), LocalDate.of(2017, 2, 1).atTime(0, 0, 0));
long count = duration.toDays();
System.out.println(count); // 31!

※LocalDateTimeで最初からインスタンスを作っても良いが、日付の意図を示すためにあえて atTime() を使用

ChronoUnitでもOK

期間を表現する必要がなくて、本当に日数をカウントするだけなら java.time.temporal.ChronoUnit でよさそう。

long count = ChronoUnit.DAYS.between(LocalDate.of(2017, 1, 1), LocalDate.of(2017, 2, 1));
System.out.println(count); // 31!

参考