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 .