Рассчитать количество недель между двумя датами в Java

Научитесь вычислять количество недель между двумя заданными датами в Java. Мы будем использовать новый API даты и времени Java 8 и его классы для расчетов. Мы также научимся корректировать смещения часовых поясов при выполнении расчетов.

Прежде чем погрузиться в реализацию, давайте разберемся с проблемой. Расчет количества недель между двумя датами включает расчет разницы в днях и последующее преобразование этой разницы в недели. Кроме того, нам может потребоваться рассмотреть неполные недели, то есть, если разница в днях не делится на 7 без остатка.

1. Получите количество недель с помощью ChronoUnit.WEEKS.between()

Метод ChronoUnit.WEEKS.between() вычисляет разницу между двумя временными типами, такими как LocalDate, LocalDateTime и т. д.

Например, при использовании объектов LocalDate нам не важны правила часового пояса, и, таким образом, расчет становится очень простым.

LocalDate startLd = LocalDate.of(2023, 8, 5);LocalDate endLd = LocalDate.of(2023, 9, 5); // Difference is 31 dayslong numWeeks = ChronoUnit.WEEKS.between(startLd, endLd); //4

Если нам интересно узнать также и неполные недели, то нам нужно знать точную разницу в днях и рассчитать ее самостоятельно.

long daysDifference = ChronoUnit.DAYS.between(startLd, endLd); // 31int extraDays = Long.valueOf(daysDifference % 7).intValue(); //3

2. Количество недель между двумя экземплярами ZonedDateTime

Расширяя предыдущий пример, мы можем вычислить разницу в неделях между двумя датами в разных часовых поясах. В Java 8 класс ZonedDateTime представляет дату и время с часовым поясом в календарной системе ISO-8601. Этот класс учитывает летнее время и предоставляет полное решение для работы с моментами времени в разных часовых поясах.

Метод between() внутренне вызывает метод ZonedDateTime.until(), который вычисляет количество времени между двумя объектами ZonedDateTime. Если часовой пояс отличается между двумя зонированными датами-временами, указанная конечная дата-время нормализуется, чтобы иметь тот же пояс, что и эта дата-время.

ZonedDateTime startDateTime = ZonedDateTime.parse("2022-01-01T00:00:00Z[UTC]");ZonedDateTime endDateTime = ZonedDateTime.parse("2022-12-31T23:59:59Z[UTC]");long numWeeks = ChronoUnit.WEEKS.between(startDateTime, endDateTime); 

Расчет фактически преобразует оба зонированных объекта datetime в моменты времени, а затем вычисляет период между моментами времени.

3. Заключение

В этом руководстве по Java мы изучили различные подходы к вычислению количества недель между двумя датами с использованием API даты и времени Java. Хотя обсуждаемые концепции просты, они все равно полезны при необходимости.

Исходный код на Github

Прокрутить вверх