Obtenir une date sans heure en Java

Obtenir une date sans heure en Java

1. introduction

Dans ce court tutoriel, nous allons montrer comment obtenir unDate sans temps en Java.

Nous allons montrer comment procéder avant et après Java 8 car les choses sont devenues un peu différentes après la sortie de la nouvelle API time dans Java 8.

2. Avant Java 8

Avant Java 8, il n’existait pas de moyen direct d’obtenir unDate sans temps, à moins d’utiliser des bibliothèques tierces comme Joda-time.

C'est parce quethe Date class in Java is a representation of a specific instant in time, expressed in milliseconds. Par conséquent, cela rend impossible d'ignorer l'heure sur unDate.

Dans les sections suivantes, nous présenterons quelques solutions de contournement courantes pour résoudre ce problème.

2.1. Utilisation deCalendar

L'un des moyens les plus courants d'obtenir unDate sans temps est d'utiliseruse the Calendar class to set the time to zero. En faisant cela, nous obtenons une date propre, avec l'heure réglée au début de la journée.

Voyons cela dans le code:

public static Date getDateWithoutTimeUsingCalendar() {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    return calendar.getTime();
}

Si nous appelons cette méthode, nous obtenons une date comme celle-ci:

Sat Jun 23 00:00:00 CEST 2018

Comme nous pouvons le voir, il renvoie une date complète avec l'heure fixée à zéro, maiswe can’t ignore the time.

De plus, pour nous assurer qu'il n'y a pas d'heure définie dans lesDate renvoyés, nous pouvons créer le test suivant:

@Test
public void whenGettingDateWithoutTimeUsingCalendar_thenReturnDateWithoutTime() {
    Date dateWithoutTime = DateWithoutTime.getDateWithoutTimeUsingCalendar();

    Calendar calendar = Calendar.getInstance();
    calendar.setTime(dateWithoutTime);
    int day = calendar.get(Calendar.DAY_OF_MONTH);

    calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY - 1);
    assertEquals(day, calendar.get(Calendar.DAY_OF_MONTH));

    calendar.setTimeInMillis(dateWithoutTime.getTime() + MILLISECONDS_PER_DAY);
    assertNotEquals(day, calendar.get(Calendar.DAY_OF_MONTH));
}

Comme nous pouvons le constater, lorsque nous ajoutons à la date les millisecondes d’une journée moins une, nous obtenons le même jour, mais lorsque nous ajoutons une journée complète, nous obtenons le lendemain.

2.2. Utilisation d'un formateur

Une autre façon de faire est deformatting a Date into a String without the time and then convert that String back to a Date. Puisque leString a été formaté sans l'heure, leDate converti aura le temps mis à zéro.

Implémentons-le pour voir comment cela fonctionne:

public static Date getDateWithoutTimeUsingFormat()
  throws ParseException {
    SimpleDateFormat formatter = new SimpleDateFormat(
      "dd/MM/yyyy");
    return formatter.parse(formatter.format(new Date()));
}

Cette implémentation retourne la même chose que la méthode présentée dans la section précédente:

Sat Jun 23 00:00:00 CEST 2018

Encore une fois, nous pouvons utiliser un test comme nous l'avons fait auparavant pour nous assurer qu'il n'y a pas de temps dans lesDate renvoyés.

3. Utiliser Java 8

Avec la publication de la nouvelle API temporelle dans Java 8, il existe un moyen plus simple d'obtenir une date sans l'heure. L’une des nouvelles fonctionnalités de cette nouvelle API est qu’il existe plusieurs classes pour travailler avec des dates avec ou sans heure, ou même avec le temps.

Pour le bien de cet article, nous allons nous concentrer sur la classeLocalDate, qui représente exactement ce dont nous avons besoin, une date sans l'heure.

Voyons cela avec cet exemple:

public static LocalDate getLocalDate() {
    return LocalDate.now();
}

Cette méthode renvoie un objetLocalDate avec cette représentation de date:

2018-06-23

Comme nous pouvons le voir, il ne renvoie qu'une date,the time is completely ignored.

Encore une fois, testons-la comme avant pour nous assurer que cette méthode fonctionne comme prévu:

@Test
public void whenGettingLocalDate_thenReturnDateWithoutTime() {
    LocalDate localDate = DateWithoutTime.getLocalDate();

    long millisLocalDate = localDate
      .atStartOfDay()
      .toInstant(OffsetDateTime
        .now()
        .getOffset())
      .toEpochMilli();

    Calendar calendar = Calendar.getInstance();

    calendar.setTimeInMillis(
      millisLocalDate + MILLISECONDS_PER_DAY - 1);
    assertEquals(
      localDate.getDayOfMonth(),
      calendar.get(Calendar.DAY_OF_MONTH));

    calendar.setTimeInMillis(millisLocalDate + MILLISECONDS_PER_DAY);
    assertNotEquals(
      localDate.getDayOfMonth(),
      calendar.get(Calendar.DAY_OF_MONTH));
}

4. Conclusion

Dans cet article, nous avons montré comment obtenir unDate sans temps en Java. Nous avons d’abord montré comment le faire avant Java 8 et aussi avec Java 8.

Comme nous avons pu le voir dans les exemples implémentés dans l'article, en utilisantJava 8 should be always the preferred option, car il a une représentation spécifique pour travailler avec des dates sans heure.

Comme toujours, le code source complet des exemples est disponibleover on GitHub.