Ajouter des heures à une date en Java

1. Vue d'ensemble

Avant Java 8, java.util.Date était l'une des classes les plus couramment utilisées pour représenter les valeurs date-heure en Java.

Ensuite, Java 8 a introduit java.time.LocalDateTime et java.time.ZonedDateTime. Java 8 nous permet également de représenter une heure spécifique sur la chronologie en utilisant java.time.Instant.

Dans ce didacticiel, nous allons apprendre à ajouter ou soustraire n heures à une date-heure donnée en Java . Nous allons d'abord examiner certaines classes Java standard liées à la date et l'heure, puis nous présenterons quelques options tierces.

Pour en savoir plus sur l'API Java 8 DateTime, nous vous suggérons de lire cet article.

2. java.util.Date

Si nous utilisons Java 7 ou une version antérieure, nous pouvons utiliser les classes java.util.Date et java.util.Calendar pour la plupart des traitements liés à la date et à l'heure.

Voyons comment ajouter n heures à un objet Date donné :

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

Notez que Calendar.HOUR_OF_DAY fait référence à une horloge de 24 heures .

La méthode ci-dessus renvoie un nouvel objet Date , dont la valeur serait soit (date + heures) soit (date - heures) , selon que nous passons respectivement une valeur positive ou négative d' heures .

Supposons que nous ayons une application Java 8, mais que nous souhaitons tout de même travailler à notre manière avec les instances java.util.Date .

Dans un tel cas, nous pouvons opter pour l'approche alternative suivante:

  1. Utilisez la méthode java.util.Date toInstant () pour convertir un objet Date en une instance java.time.Instant
  2. Ajoutez une durée spécifique à l' objet java.time.Instant à l'aide de la méthode plus ()
  3. Récupérez notre instance java.util.Date en passant l' objet java.time.Instant à la méthode java.util.Date.from ()

Jetons un coup d'œil à cette approche:

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

Cependant, notez qu'il est toujours recommandé d'utiliser la nouvelle API DateTime pour toutes les applications sur Java 8 ou versions supérieures.

3. java.time.LocalDateTime / ZonedDateTime

Dans Java 8 ou version ultérieure, l'ajout d'heures à une instance java.time.LocalDateTime ou java.time.ZonedDateTime est assez simple et utilise la méthode 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); }

Et si nous souhaitons soustraire quelques heures?

Passer une valeur négative d'heures à la méthode plusHours () ferait très bien l'affaire. Cependant, il est recommandé d'utiliser la méthode 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); }

Les méthodes plusHours () et minusHours () dans java.time.ZonedDateTime fonctionnent exactement de la même manière.

4. java.time.Instant

Comme nous le savons, java.time.Instant introduit dans l'API Java 8 DateTime représente un moment précis de la chronologie.

Pour ajouter quelques heures à un objet Instant , nous pouvons utiliser sa méthode plus () avec un 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); }

De même, la méthode minus () peut être utilisée pour soustraire un TemporalAmount spécifique .

5. Apache Commons DateUtils

La classe DateUtils de la bibliothèque Apache Commons Lang expose une méthode statique addHours () :

public static Date addHours(Date date, int amount)

La méthode prend un objet java.util.Date avec un montant que nous souhaitons lui ajouter, dont la valeur peut être positive ou négative.

Un nouvel objet java.util.Date est renvoyé en tant que résultat:

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

La dernière version d' Apache Commons Lang est disponible sur Maven Central.

6. Heure Joda

Joda Time est une alternative à l'API Java 8 DateTime et fournit ses propres implémentations DateTime .

La plupart de ses classes liées à DateTime exposent les méthodes plusHours () et minusHours () pour nous aider à ajouter ou soustraire un nombre d'heures donné à un objet DateTime .

Regardons un exemple:

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

Nous pouvons facilement consulter la dernière version disponible de Joda Time sur Maven Central.

7. Conclusion

Dans ce didacticiel, nous avons couvert plusieurs façons d'ajouter ou de soustraire un nombre d'heures donné aux valeurs de date et d'heure Java standard.

Nous avons également examiné certaines bibliothèques tierces comme alternative. Comme d'habitude, le code source complet est disponible à l'adresse over sur GitHub.