Добавяне на часове към дата в Java

1. Общ преглед

Преди Java 8 java.util.Date беше един от най-често използваните класове за представяне на стойности за дата и час в Java.

Тогава Java 8 представи java.time.LocalDateTime и java.time.ZonedDateTime. Java 8 също ни позволява да представим конкретно време на времевата линия, използвайки java.time.Instant.

В този урок ще се научим да добавяме или изваждаме n часа от датата-час в Java . Първо ще разгледаме някои стандартни класове, свързани с дата и час на Java, а след това ще покажем няколко опции на трети страни.

За да научите повече за Java 8 DateTime API, бихме ви предложили да прочетете тази статия.

2. java.util.Date

Ако използваме Java 7 или по-ниска, можем да използваме класовете java.util.Date и java.util.Calendar за повечето обработки, свързани с дата и час.

Нека да видим как да добавим n часа към даден обект Date :

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.util.Date .

В такъв случай можем да изберем следния алтернативен подход:

  1. Използвайте java.util.Date toInstant () метод, за да преобразувате Дата обект към java.time.Instant инстанция
  2. Добави специфичен Продължителност на java.time.Instant обекта с помощта на плюс () метод
  3. Възстановяване ни java.util.Date например чрез преминаване в java.time.Instant обект на 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 на DateTime за всички приложения на Java 8 или по-нови версии.

3. java.time.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); }

Ами ако искаме да извадим няколко часа?

Предаването на отрицателна стойност на часовете към метода plusHours () би било добре. Препоръчително е обаче да използвате метода minusHours () :

@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); }

Методите plusHours () и minusHours () в java.time.ZonedDateTime работят точно по същия начин.

4. java.time.Instant

Както знаем, java.time.Instant, въведен в Java 8 DateTime API представлява специфичен момент на времевата линия.

За да добавим няколко часа към незабавен обект, можем да използваме неговия метод plus () с java.time.temporal.TemporalAmount :

@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); }

По същия начин методът minus () може да се използва за изваждане на конкретен TemporalAmount .

5. Apache Commons DateUtils

Класът DateUtils от библиотеката Apache Commons Lang излага статичен метод addHours () :

public static Date addHours(Date date, int amount)

Методът включва обект java.util.Date заедно със сума, която искаме да добавим към него, чиято стойност може да бъде положителна или отрицателна.

В резултат се връща нов обект java.util.Date :

@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

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

Повечето от свързаните с DateTime класове излагат методите plusHours () и minusHours () , за да ни помогнат да добавим или извадим определен брой часове от обект 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.