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 .