TemporalAdjuster en Java

TemporalAdjuster en Java

1. Vue d'ensemble

Dans ce didacticiel, nous allons examiner rapidement lesTemporalAdjuster et les utiliser dans quelques scénarios pratiques.

Java 8 a introduit une nouvelle bibliothèque pour travailler avec les dates et les heures -java.time etTemporalAdjuster en font partie. Si vous voulez en savoir plus sur le contrôlejava.time,this introductory article.

En termes simples,TemporalAdjuster est une stratégie pour ajuster un objetTemporal. Avant d'entrer dans l'utilisation deTemporalAdjuster, jetons un coup d'œil à l'interface deTemporal elle-même.

2. Temporal

UnTemporal définit une représentation d'une date, d'une heure ou d'une combinaison des deux, en fonction de l'implémentation que nous allons utiliser.

Il existe un certain nombre d'implémentations de l'interfaceTemporal, notamment:

  • LocalDate - qui représente une date sans fuseau horaire

  • LocalDateTime - qui représente une date et une heure sans fuseau horaire

  • HijrahDate - qui représente une date dans le système de calendrier Hijrah

  • MinguoDate - qui représente une date dans le système de calendrier Minguo

  • ThaiBuddhistDate - qui représente une date dans le système de calendrier bouddhiste thaïlandais

3. TemporalAdjuster

L'une des interfaces incluses dans cette nouvelle bibliothèque estTemporalAdjuster.

TemporalAdjuster est une interface fonctionnelle qui a de nombreuses implémentations prédéfinies dans la classeTemporalAdjusters. L'interface a une seule méthode abstraite nomméeadjustInto() qui peut être appelée dans n'importe laquelle de ses implémentations en lui passant un objetTemporal.

TemporalAdjuster nous permet d'effectuer des manipulations de date complexes. For example, nous pouvons obtenir la date du dimanche suivant, le dernier jour du mois en cours ou le premier jour de l'année suivante. Nous pouvons, bien sûr, le faire en utilisant les anciensjava.util.Calendar.

Cependant, la nouvelle API supprime la logique sous-jacente à l'aide de ses implémentations prédéfinies. Pour plus d'informations, visitez le siteJavadoc.

4. TemporalAdjusters prédéfinis

La classeTemporalAdjusters a de nombreuses méthodes statiques prédéfinies qui renvoient un objetTemporalAdjuster pour ajuster les objetsTemporal de nombreuses manières différentes, quelle que soit l'implémentation deTemporal.

Voici une courte liste de ces méthodes et une définition rapide de celles-ci:

  • dayOfWeekInMonth() - un ajusteur pour le jour de la semaine ordinale. Par exemple la date du deuxième mardi de mars

  • firstDayOfMonth() - un ajusteur pour la date du premier jour du mois en cours

  • firstDayOfNextMonth() - un ajusteur pour la date du premier jour du mois suivant

  • firstDayOfNextYear() - un ajusteur pour la date du premier jour de l'année suivante

  • firstDayOfYear() - un ajusteur pour la date du premier jour de l'année en cours

  • lastDayOfMonth() - un ajusteur pour la date du dernier jour du mois en cours

  • nextOrSame() - un ajusteur pour la date de la prochaine occurrence d'un jour de la semaine spécifique ou le même jour dans le cas où aujourd'hui correspond au jour de la semaine requis

Comme on peut le constater, les noms des méthodes sont assez explicites. Pour plus deTemporalAdjusters, visitez leJavadoc.

Let’s start with a simple example - au lieu d'utiliser une date spécifique comme dans les exemples, nous pouvons utiliserLocalDate.now() pour obtenir la date actuelle à partir de l'horloge système.

Mais, pour ce didacticiel, nous allons utiliser une date fixe afin que les tests n'échouent pas plus tard lorsque le résultat attendu change. Voyons comment nous pouvons utiliser la classeTemporalAdjusters pour obtenir la date du dimanche après le 08/07/2017:

@Test
public void whenAdjust_thenNextSunday() {
    LocalDate localDate = LocalDate.of(2017, 07, 8);
    LocalDate nextSunday = localDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));

    String expected = "2017-07-09";

    assertEquals(expected, nextSunday.toString());
}

Voici comment nous pouvons obtenir le dernier jour du mois en cours:

LocalDate lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());

5. Définition d'implémentations personnaliséesTemporalAdjuster

Nous pouvons également définir nos implémentations personnalisées pourTemporalAdjuster. Il y a deux façons différentes de le faire.

5.1. Utilisation d'expressions Lambda

Voyons comment nous pouvons obtenir la date qui est 14 jours après le 08/07/2017 en utilisant la méthodeTemporal.with():

@Test
public void whenAdjust_thenFourteenDaysAfterDate() {
    LocalDate localDate = LocalDate.of(2017, 07, 8);
    TemporalAdjuster temporalAdjuster = t -> t.plus(Period.ofDays(14));
    LocalDate result = localDate.with(temporalAdjuster);

    String fourteenDaysAfterDate = "2017-07-22";

    assertEquals(fourteenDaysAfterDate, result.toString());
}

Dans cet exemple, à l'aide d'une expression lambda, nous définissons l'objettemporalAdjuster pour ajouter 14 jours à l'objetlocalDate, qui contient la date (08/07/2017).

Voyons comment nous pouvons obtenir la date du jour ouvrable juste après le 08/07/2017 en définissant nos propres implémentationsTemporalAdjuster à l'aide d'une expression lambda. Mais, cette fois, en utilisant la méthode de fabrique statique deofDateAdjuster():

static TemporalAdjuster NEXT_WORKING_DAY = TemporalAdjusters.ofDateAdjuster(date -> {
    DayOfWeek dayOfWeek = date.getDayOfWeek();
    int daysToAdd;
    if (dayOfWeek == DayOfWeek.FRIDAY)
        daysToAdd = 3;
    else if (dayOfWeek == DayOfWeek.SATURDAY)
        daysToAdd = 2;
    else
        daysToAdd = 1;
    return today.plusDays(daysToAdd);
});

Tester notre code:

@Test
public void whenAdjust_thenNextWorkingDay() {
    LocalDate localDate = LocalDate.of(2017, 07, 8);
    TemporalAdjuster temporalAdjuster = NEXT_WORKING_DAY;
    LocalDate result = localDate.with(temporalAdjuster);

    assertEquals("2017-07-10", date.toString());
}

5.2. En implémentant l'interfaceTemporalAdjuster

Voyons comment nous pouvons écrire unTemporalAdjuster personnalisé qui obtient le jour ouvrable après le 08/07/2017 en implémentant l'interfaceTemporalAdjuster:

public class CustomTemporalAdjuster implements TemporalAdjuster {

    @Override
    public Temporal adjustInto(Temporal temporal) {
        DayOfWeek dayOfWeek
          = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));

        int daysToAdd;
        if (dayOfWeek == DayOfWeek.FRIDAY)
            daysToAdd = 3;
        else if (dayOfWeek == DayOfWeek.SATURDAY)
            daysToAdd = 2;
        else
            daysToAdd = 1;
        return temporal.plus(daysToAdd, ChronoUnit.DAYS);
    }
}

Maintenant, exécutons notre test:

@Test
public void whenAdjustAndImplementInterface_thenNextWorkingDay() {
    LocalDate localDate = LocalDate.of(2017, 07, 8);
    CustomTemporalAdjuster temporalAdjuster = new CustomTemporalAdjuster();
    LocalDate nextWorkingDay = localDate.with(temporalAdjuster);

    assertEquals("2017-07-10", nextWorkingDay.toString());
}

6. Conclusion

Dans ce didacticiel, nous avons montré ce qu'estTemporalAdjuster, lesTemporalAdjusters, prédéfinis comment ils peuvent être utilisés et comment nous pouvons implémenter nos implémentations personnalisées deTemporalAdjuster de deux manières différentes.

L'implémentation complète de ce tutoriel peut être trouvéeover on GitHub.