概要
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!