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

Увеличение даты в Java

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

1. Обзор

В этом руководстве мы рассмотрим способы увеличения даты на один день с помощью Java. До Java 8 стандартные библиотеки даты и времени Java были не очень удобными для пользователя. Следовательно, Joda-Time стала де-факто стандартной библиотекой даты и времени для Java до Java 8.

Существуют также другие классы и библиотеки, которые можно использовать для выполнения этой задачи, например java.util.Calendar и Apache Commons.

Java 8 включает улучшенный API даты и времени для устранения недостатков своих старых библиотек.

Поэтому мы смотрим , как увеличить дату на один день, используя Java 8, Joda-Time API, класс Java Calendar и библиотеку Apache Commons .

2. Зависимости Maven

Следующие зависимости должны быть включены в файл pom.xml :

<dependencies>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>

Вы можете найти последнюю версию Joda-Time на Maven Central , а также последнюю версию Apache Commons Lang .

3. Использование java.time

Класс java.time.LocalDate — это неизменное представление даты и времени, которое часто рассматривается как год-месяц-день.

LocalDate имеет много методов для манипулирования датами, давайте посмотрим, как мы можем использовать его для выполнения той же задачи:

public static String addOneDay(String date) {
return LocalDate
.parse(date)
.plusDays(1)
.toString();
}

В этом примере мы используем класс java.time.LocalDate и его метод plusDays() для увеличения даты на один день.

Теперь давайте проверим, что этот метод работает должным образом:

@Test
public void givenDate_whenUsingJava8_thenAddOneDay()
throws Exception {

String incrementedDate = addOneDay("2018-07-03");
assertEquals("2018-07-04", incrementedDate);
}

4. Использование java.util.Calendar

Другой подход заключается в использовании java.util.Calendar и его метода add() для увеличения даты.

Мы будем использовать его вместе с java.text.SimpleDateFormat для целей форматирования даты:

public static String addOneDayCalendar(String date) 
throws ParseException {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(sdf.parse(date));
c.add(Calendar.DATE, 1);
return sdf.format(c.getTime());
}

java.text.SimpleDateFormat обеспечивает использование ожидаемого формата даты. Дата увеличивается с помощью метода add() .

Еще раз давайте удостоверимся, что этот подход работает так, как задумано:

@Test
public void givenDate_whenUsingCalendar_thenAddOneDay()
throws Exception {

String incrementedDate = addOneDayCalendar("2018-07-03");
assertEquals("2018-07-04", incrementedDate);
}

5. Использование Joda-Time

Класс org.joda.time.DateTime имеет множество методов, которые помогают правильно работать с датой и временем.

Давайте посмотрим, как мы можем использовать его для увеличения даты на один день:

public static String addOneDayJodaTime(String date) {
DateTime dateTime = new DateTime(date);
return dateTime
.plusDays(1)
.toString("yyyy-MM-dd");
}

Здесь мы используем класс org.joda.time.DateTime и его метод plusDays() для увеличения даты на один день.

Мы можем убедиться, что приведенный выше код работает со следующим модульным тестом:

@Test
public void givenDate_whenUsingJodaTime_thenAddOneDay() throws Exception {
String incrementedDate = addOneDayJodaTime("2018-07-03");
assertEquals("2018-07-04", incrementedDate);
}

6. Использование Apache Commons

Другой библиотекой, обычно используемой для манипулирования датами (среди прочего), является Apache Commons. Это набор утилит, связанных с использованием объектов java.util.Calendar и java.util.Date .

Для нашей задачи мы можем использовать класс org.apache.commons.lang3.time.DateUtils и его метод addDays() (обратите внимание, что SimpleDateFormat снова используется для форматирования даты):

public static String addOneDayApacheCommons(String date) 
throws ParseException {

SimpleDateFormat sdf
= new SimpleDateFormat("yyyy-MM-dd");
Date incrementedDate = DateUtils
.addDays(sdf.parse(date), 1);
return sdf.format(incrementedDate);
}

Как обычно, мы проверим результаты с помощью модульного теста:

@Test
public void givenDate_whenUsingApacheCommons_thenAddOneDay()
throws Exception {

String incrementedDate = addOneDayApacheCommons(
"2018-07-03");
assertEquals("2018-07-04", incrementedDate);
}

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

В этой быстрой статье мы рассмотрели различные подходы к решению простой задачи увеличения даты на один день. Мы показали, как этого можно добиться с помощью базовых API-интерфейсов Java, а также некоторых популярных сторонних библиотек.

Примеры кода, использованные в этой статье, можно найти на GitHub .