Во-первых, то, что вы спрашиваете, не является четко определенным. Например, между моментами 2020-03-01T06: 00: 00Z и 2020-03-31T05: 00: 00Z могут быть:
- 29 дней 23 часа в часовом поясе Австралии / Мельбурна;
- 30 дней в часовом поясе Европы / Парижа;
- 1 месяц 1 день в часовом поясе Америки / Лос-Анджелеса.
Точный результат в заданном часовом поясе
ZoneId zone = ZoneId.of("America/Los_Angeles");
Instant start = Instant.parse("2020-03-01T06:00:00Z");
Instant end = Instant.parse("2020-03-31T05:00:00Z");
ZonedDateTime startZdt = start.atZone(zone);
LocalDate startDate = startZdt.toLocalDate();
ZonedDateTime endZdt = end.atZone(zone);
LocalDate endDate = endZdt.toLocalDate();
Period p = Period.between(startDate, endDate);
if (startZdt.plus(p).isAfter(endZdt)) {
// The time of day on the end date is earlier, so don’t count a full date
endDate = endDate.minusDays(1);
p = Period.between(startDate, endDate);
}
System.out.println(p);
Вывод:
P1M1D
Считать как период 1 месяц 1 день.
Приблизительный результат независимо от часового пояса
Предпочитаю оставить как можно большую часть вычислений на java .time. Сюда входит оценка продолжительности месяца.
Duration diff = Duration.between(start, end);
Duration durationOfAMonth = ChronoUnit.MONTHS.getDuration();
long months = diff.dividedBy(durationOfAMonth);
diff = diff.minus(durationOfAMonth.multipliedBy(months));
long days = diff.toDays();
System.out.println("" + months + " months " + days + " days");
0 месяцев 29 дней