Aggiungi ore a una data in Java

1. Panoramica

Prima di Java 8, java.util.Date era una delle classi più comunemente utilizzate per rappresentare i valori di data e ora in Java.

Quindi Java 8 ha introdotto java.time.LocalDateTime e java.time.ZonedDateTime. Java 8 ci consente anche di rappresentare un orario specifico sulla timeline utilizzando java.time.Instant.

In questo tutorial impareremo ad aggiungere o sottrarre n ore da una determinata data-ora in Java . Per prima cosa esamineremo alcune classi standard relative alla data e all'ora di Java, quindi mostreremo alcune opzioni di terze parti.

Per saperne di più sull'API DateTime di Java 8, suggeriamo di leggere questo articolo.

2. java.util.Date

Se stiamo utilizzando Java 7 o versioni precedenti, possiamo utilizzare le classi java.util.Date e java.util.Calendar per la maggior parte della gestione correlata alla data e all'ora.

Vediamo come aggiungere n ore a un determinato oggetto 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(); }

Tieni presente che Calendar.HOUR_OF_DAY si riferisce a un orologio a 24 ore .

Il metodo sopra restituisce un nuovo oggetto Date , il cui valore sarebbe (data + ore) o (data - ore) , a seconda che passiamo rispettivamente un valore positivo o negativo di ore .

Supponiamo di avere un'applicazione Java 8, ma vogliamo comunque lavorare a modo nostro con le istanze java.util.Date .

In tal caso, possiamo scegliere di adottare il seguente approccio alternativo:

  1. Utilizzare il metodo java.util.Date toInstant () per convertire un oggetto Date in un'istanza java.time.Instant
  2. Aggiungere una specifica Durata alla java.time.Instant oggetto utilizzando il più () metodo
  3. Recupera la nostra istanza java.util.Date passando l' oggetto java.time.Instant al metodo java.util.Date.from ()

Diamo una rapida occhiata a questo approccio:

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

Tuttavia, tieni presente che è sempre consigliabile utilizzare la nuova API DateTime per tutte le applicazioni su Java 8 o versioni successive.

3. java.time.LocalDateTime / ZonedDateTime

In Java 8 o versioni successive, l'aggiunta di ore a un'istanza java.time.LocalDateTime o java.time.ZonedDateTime è piuttosto semplice e utilizza il metodo 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); }

E se volessimo sottrarre qualche ora?

Passare un valore negativo di ore al metodo plusHours () andrebbe benissimo. Tuttavia, si consiglia di utilizzare il metodo 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); }

I metodi plusHours () e minusHours () in java.time.ZonedDateTime funzionano esattamente allo stesso modo.

4. java.time.Instant

Come sappiamo, java.time.Instant introdotto in Java 8 DateTime API rappresenta un momento specifico sulla timeline.

Per aggiungere alcune ore a un oggetto Instant , possiamo usare il suo metodo plus () con 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); }

Allo stesso modo, il metodo meno () può essere utilizzato per sottrarre un valore TemporalAmount specifico .

5. Apache Commons DateUtils

La classe DateUtils della libreria Apache Commons Lang espone un metodo addHours () statico :

public static Date addHours(Date date, int amount)

Il metodo accetta un oggetto java.util.Date insieme a un importo che desideriamo aggiungere, il cui valore può essere positivo o negativo.

Come risultato viene restituito un nuovo oggetto 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); }

L'ultima versione di Apache Commons Lang è disponibile su Maven Central.

6. Joda Time

Joda Time è un'alternativa all'API DateTime di Java 8 e fornisce le proprie implementazioni DateTime .

La maggior parte delle sue classi correlate a DateTime espongono i metodi plusHours () e minusHours () per aiutarci ad aggiungere o sottrarre un determinato numero di ore da un oggetto DateTime .

Diamo un'occhiata a un esempio:

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

Possiamo facilmente controllare l'ultima versione disponibile di Joda Time su Maven Central.

7. Conclusione

In questo tutorial, abbiamo coperto diversi modi per aggiungere o sottrarre un determinato numero di ore dai valori di data e ora Java standard.

Abbiamo anche esaminato alcune librerie di terze parti come alternativa. Come al solito, il codice sorgente completo è disponibile su GitHub.