Научитесь вычислять количество недель между двумя заданными датами в 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. Хотя обсуждаемые концепции просты, они все равно полезны при необходимости.