Ajouter des heures à une date en Java

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 introduitjava.time.LocalDateTime etjava.time.ZonedDateTime. Java 8 nous permet également de représenter une heure spécifique sur la timeline en utilisantjava.time.Instant.

Dans ce didacticiel, nous allons apprendre àadd or subtract n hours from a given date-time in 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 lirethis article.

2. java.util.Date

Si nous utilisons Java 7 ou une version antérieure, nous pouvons utiliser les classesjava.util.Date etjava.util.Calendar pour la plupart des manipulations liées à la date-heure.

Voyons comment ajoutern heures à un objetDate 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 queCalendar.HOUR_OF_DAY is referring to a 24-hour clock.

La méthode ci-dessus renvoie un nouvel objetDate, dont la valeur serait soit(date + hours) soit(date – hours), selon que nous passons une valeur positive ou négative dehours respectivement.

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

Dans ce cas, nous pouvons opter pour l’approche alternative suivante:

  1. Utilisez la méthodejava.util.DatetoInstant() pour convertir un objetDate en une instancejava.time.Instant

  2. Ajoutez unDuration spécifique à l'objetjava.time.Instant en utilisant la méthodeplus()

  3. Récupérez notre instancejava.util.Date en passant l'objetjava.time.Instant à la méthodejava.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 queit’s always recommended to use the new DateTime API for all applications on Java 8 or higher versions.

3. java.time.LocalDateTime/ZonedDateTime

Dans Java 8 ou version ultérieure, ajouter des heures à une instance dejava.time.LocalDateTime or java.time.ZonedDateTime est assez simple et utilise la méthodeplusHours():

@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éthodeplusHours() ferait très bien. Cependant, il est recommandé d’utiliser la méthodeminusHours():

@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éthodesplusHours() etminusHours() dans lesjava.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 spécifique sur la chronologie.

Pour ajouter quelques heures à un objetInstant, nous pouvons utiliser sa méthodeplus() avec unjava.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éthodeminus() peut être utilisée pour soustraire unTemporalAmount spécifique.

5. Apache CommonsDateUtils

La classeDateUtils de la bibliothèque Apache Commons Lang expose une méthodestaticaddHours():

public static Date addHours(Date date, int amount)

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

Un nouvel objetjava.util.Date est renvoyé comme 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 deApache Commons Lang est disponible àMaven Central.

6. Joda Time

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

La plupart de ses classes associéesDateTime exposent les méthodesplusHours() etminusHours() pour nous aider à ajouter ou soustraire un nombre d'heures donné à un objetDateTime.

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 vérifier la dernière version disponible deJoda Time àMaven Central.

7. Conclusion

Dans ce didacticiel, nous avons présenté plusieurs manières d’ajouter ou de soustraire un nombre donné d’heures des valeurs date / heure standard de Java.

Nous avons également envisagé des bibliothèques tierces. Comme d'habitude, le code source complet est disponibleover on GitHub.