Перейти к основному содержимому

Вычесть дни из даты в Java

· 2 мин. чтения

1. Обзор

В этом руководстве мы познакомимся с различными способами вычитания дней из объекта Date в Java.

Мы начнем с использования Date Time API, представленного в Java 8. После этого мы узнаем, как это сделать, используя классы из пакета java.util , и, наконец, добьемся того же с помощью с помощью библиотеки Joda-Time .

2. java.time.LocalDateTime

API даты/времени, представленный в Java 8, в настоящее время является наиболее жизнеспособным вариантом для вычисления даты и времени.

Давайте посмотрим, как вычесть дни из объекта java.util.LocalDateTime в Java 8 :

@Test
public void givenLocalDate_whenSubtractingFiveDays_dateIsChangedCorrectly() {
LocalDateTime localDateTime = LocalDateTime.of(2022, 4, 20, 0, 0);

localDateTime = localDateTime.minusDays(5);

assertEquals(15, localDateTime.getDayOfMonth());
assertEquals(4, localDateTime.getMonthValue());
assertEquals(2022, localDateTime.getYear());
}

3. java.util.Календарь

Date и Calendar из java.util являются наиболее часто используемыми служебными классами до Java 8 для операций с датами.

Давайте вычтем пять дней из даты, используя java.util.Calendar :

@Test
public void givenCalendarDate_whenSubtractingFiveDays_dateIsChangedCorrectly() {
Calendar calendar = Calendar.getInstance();
calendar.set(2022, Calendar.APRIL, 20);

calendar.add(Calendar.DATE, -5);

assertEquals(15, calendar.get(Calendar.DAY_OF_MONTH));
assertEquals(Calendar.APRIL, calendar.get(Calendar.MONTH));
assertEquals(2022, calendar.get(Calendar.YEAR));
}

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

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

4. Джода-Время

Мы можем использовать Joda-Time как лучшую альтернативу исходному решению Java для обработки даты и времени. Библиотека предоставляет более интуитивно понятный API, несколько календарных систем, безопасность потоков и неизменяемые объекты.

Чтобы использовать Joda-Time , нам нужно включить его как зависимость в файл pom.xml :

<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.14</version>
</dependency>

Давайте вычтем пять дней из объекта DateTime Joda-Time :

@Test
public void givenJodaDateTime_whenSubtractingFiveDays_dateIsChangedCorrectly() {
DateTime dateTime = new DateTime(2022, 4, 20, 12, 0, 0);

dateTime = dateTime.minusDays(5);

assertEquals(15, dateTime.getDayOfMonth());
assertEquals(4, dateTime.getMonthOfYear());
assertEquals(2022, dateTime.getYear());
}

Joda-Time — хорошее решение для устаревшего кода. Однако проект официально «завершен», и автор библиотеки рекомендует переход на Java 8 Date/Time API.

5. Вывод

В этой короткой статье мы рассмотрели несколько способов вычитания дней из объекта даты.

Мы достигли этого, используя java.time.LocalDateTime и решения до Java 8: java.util.Calendar и библиотеку Joda-Time.

Как обычно, исходный код доступен на GitHub .