Рубрики
Без рубрики

Добавление Часов К Дате На Java

Изучите несколько способов сложения или вычитания заданного количества часов из даты в Java.

Автор оригинала: Shubhra Srivastava.

1. Обзор

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

Затем Java 8 представила java.time.LocalDateTime и java.time.ZonedDateTime. Java 8 также позволяет нам представлять определенное время на временной шкале с помощью java.time.Моментальный.

В этом уроке мы научимся добавлять или вычитать n часов из заданной даты-времени в Java . Сначала мы рассмотрим некоторые стандартные классы, связанные с датой и временем Java, а затем продемонстрируем несколько сторонних опций.

Чтобы узнать больше об API Java 8 DateTime, мы рекомендуем прочитать эту статью .

2. java.util.Date

Если мы используем Java 7 или ниже, мы можем использовать java.util.Дата и java.util.Календарь классы для большинства операций, связанных с датой и временем.

Давайте посмотрим, как добавить n часов к заданному Дате объекту:

public Date addHoursToJavaUtilDate(Date date, int hours) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, hours);
    return calendar.getTime();
}

Обратите внимание, что Calendar.HOUR_OF_DAY относится к 24-часовым часам .

Приведенный выше метод возвращает новый объект Date , значение которого будет либо (дата + часы) , либо (дата – часы) , в зависимости от того, передаем ли мы положительное или отрицательное значение часов соответственно.

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

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

  1. Используйте java.util.Date |/to Instant() метод преобразования объекта Date в объект java.time.Мгновенный экземпляр Добавьте определенную
  2. Длительность в java.time.Мгновенный объект с использованием метода plus() Восстановите наш
  3. java.util.Дата экземпляр, передав в java.time.Мгновенный объект для метода java.util.Date.from()

Давайте быстро рассмотрим этот подход:

@Test
public void givenJavaUtilDate_whenUsingToInstant_thenAddHours() {
    Date actualDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 5, 0)
      .getTime();
    Date expectedDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 7, 0)
      .getTime();

    assertThat(Date.from(actualDate.toInstant().plus(Duration.ofHours(2))))
      .isEqualTo(expectedDate);
}

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

3. java.время.LocalDateTime/ZonedDateTime

В Java 8 или более поздней версии добавление часов к java.time.LocalDateTime или java.time.Экземпляр ZonedDateTime довольно прост и использует метод plusHours() :

@Test
public void givenLocalDateTime_whenUsingPlusHours_thenAddHours() {
    LocalDateTime actualDateTime = LocalDateTime
      .of(2018, Month.JUNE, 25, 5, 0);
    LocalDateTime expectedDateTime = LocalDateTime.
      of(2018, Month.JUNE, 25, 10, 0);

    assertThat(actualDateTime.plusHours(5)).isEqualTo(expectedDateTime);
}

Что, если мы хотим вычесть несколько часов?

Передача отрицательного значения часов в метод plus Hours() вполне подойдет. Однако рекомендуется использовать метод минус часы() :

@Test
public void givenLocalDateTime_whenUsingMinusHours_thenSubtractHours() {
    LocalDateTime actualDateTime = LocalDateTime
      .of(2018, Month.JUNE, 25, 5, 0);
    LocalDateTime expectedDateTime = LocalDateTime
      .of(2018, Month.JUNE, 25, 3, 0);
   
    assertThat(actualDateTime.minusHours(2)).isEqualTo(expectedDateTime);

}

Методы plus Hours() и minutes Hours() в java.time.ZonedDateTime работает точно так же.

4. java.время.Моментальный

Как мы знаем, java.time.Instant введенный в Java 8 DateTime API представляет определенный момент на временной шкале.

Чтобы добавить несколько часов к Моментальный объект, мы можем использовать его плюс() способ с способ с :

@Test
public void givenInstant_whenUsingAddHoursToInstant_thenAddHours() {
    Instant actualValue = Instant.parse("2018-06-25T05:12:35Z");
    Instant expectedValue = Instant.parse("2018-06-25T07:12:35Z");

    assertThat(actualValue.plus(2, ChronoUnit.HOURS))
      .isEqualTo(expectedValue);
}

Аналогично, метод минус() можно использовать для вычитания определенного Временная сумма .

5. Apache Commons DateUtils

Класс DateUtils из библиотеки Apache Commons Lang предоставляет метод static | AddHours() :

public static Date addHours(Date date, int amount)

Метод принимает-в java.util.Дата объект вместе с суммой мы хотим добавить к нему, значение которого может быть как положительным, так и отрицательным.

Новый java.util.Дата объект возвращается в качестве результата:

@Test
public void givenJavaUtilDate_whenUsingApacheCommons_thenAddHours() {
    Date actualDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 5, 0)
      .getTime();
    Date expectedDate = new GregorianCalendar(2018, Calendar.JUNE, 25, 7, 0)
      .getTime();

    assertThat(DateUtils.addHours(actualDate, 2)).isEqualTo(expectedDate);
}

Последняя версия Apache Commons Lang доступна в Maven Central.

6. Время Джоды

Joda Time является альтернативой API Java 8 DateTime и предоставляет свои собственные реализации DateTime .

Большинство его Date Time связанных классов предоставляют plus Hours() и minutes Hours() методы, которые помогают нам добавлять или вычитать заданное количество часов из объекта DateTime .

Давайте рассмотрим пример:

@Test
public void givenJodaDateTime_whenUsingPlusHoursToDateTime_thenAddHours() {
    DateTime actualDateTime = new DateTime(2018, 5, 25, 5, 0);
    DateTime expectedDateTime = new DateTime(2018, 5, 25, 7, 0);

    assertThat(actualDateTime.plusHours(2)).isEqualTo(expectedDateTime);
}

Мы можем легко проверить последнюю доступную версию Joda Time в Maven Central .

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

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

Мы также рассмотрели некоторые сторонние библиотеки в качестве альтернативы. Как обычно, полный исходный код доступен на GitHub .