TemporalAdjuster en Java

1. Vue d'ensemble

Dans ce didacticiel, nous allons jeter un coup d'œil sur TemporalAdjuster et l'utiliser dans quelques scénarios pratiques.

Java 8 a introduit une nouvelle bibliothèque pour travailler avec les dates et les heures - java.time et TemporalAdjuster en font partie. Si vous souhaitez en savoir plus sur java.time, consultez cet article d'introduction.

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

2. Temporel

Un temporel 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' interface temporelle , 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 est TemporalAdjuster .

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

TemporalAdjuster nous permet d'effectuer des manipulations de date complexes. Par exemple , 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 l'ancien java.util.Calendar .

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

4. TemporalAdjusters prédéfinis

La classe TemporalAdjusters a de nombreuses méthodes statiques prédéfinies qui renvoient un objet TemporalAdjuster pour ajuster les objets Temporal de différentes manières, quelle que soit l'implémentation de Temporal .

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

  • dayOfWeekInMonth () - un ajusteur pour le jour ordinal de la semaine. 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 au cas où aujourd'hui correspond au jour de la semaine requis

Comme nous pouvons le voir, les noms des méthodes sont assez explicites. Pour plus de TemporalAdjusters , visitez le Javadoc.

Commençons par un exemple simple - au lieu d'utiliser une date spécifique comme dans les exemples, nous pouvons utiliser LocalDate.now () pour obtenir la date actuelle à partir de l'horloge système.

Mais, pour ce tutoriel, 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 classe TemporalAdjusters 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ées de TemporalAdjuster

Nous pouvons également définir nos implémentations personnalisées pour TemporalAdjuster . Il existe deux manières différentes de procéder.

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éthode Temporal.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' objet temporalAdjuster pour ajouter 14 jours à l' objet localDate , 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émentations TemporalAdjuster à l' aide d'une expression lambda. Mais, cette fois, en utilisant la méthode de fabrique statique ofDateAdjuster () :

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' interface TemporalAdjuster

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

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'est TemporalAdjuster , les TemporalAdjusters prédéfinis , comment ils peuvent être utilisés et comment nous pouvons implémenter nos implémentations TemporalAdjuster personnalisées de deux manières différentes.

L'implémentation complète de ce tutoriel est disponible à l'adresse over sur GitHub.