Date Java8: Exemples de manipulation des dates en java 8

L'un des changements importants en java 8 est l'introduction de nouvelle Api (JSR 310) pour la gestion des dates.

La nouvelle api datetime introduite dans java 8 s'est inspirée de Joda-Time (cette dernière est très utilisée dans les projets).
Ceci dit, l'api java.time de java 8 est différente de Joda sur certains détails.

A ce propos, l'auteur de Joda-Time (Stephen Colebourne) a participé à la réalisation de la  JSR 310.

En effet, la pratique de l'api java.util.Date (donc pour les version java <8) a mis en évidence que son design est assez déroutant, voire peu intuitif, sur certains points:

  • les années des dates démarrent de 1900,
  • les jours commencent à 1, les mois à 0,
  • pas thread safe,
  • sans parler de la gestion du lenient.

La nouvelle api java date & time est donc guidée par ces trois axes:

  • domain driven design (voir site oracle pour plus de précisions),
  • immutabilité renforcée pour garantir thread safe,
  • séparation des calendriers et chronologies.

L'objet de ce blog est de vous donner quelques concepts avancés par des exemples sans rentrer dans la théorie.

Notez donc que ce billet n'est pas structuré comme une introduction à l'api java.time.

EXEMPLE 1. Création date avec la factory 'of'.

 

Création de LocalDate en java 8

 

LocalDate ldate = LocaleDate.now();
//out 2017-xx-xx date du jour

LocalDate ldate2 = LocalDate.of(2017,Month.MARCH,29);

 

 Création de LocalDateTime avec factory 'of'

 

LocalDateTime ldt=LocalDateTime.now();

		
LocalDateTime ldt2= LocalDateTime.of(LocalDate.now() ,LocalTime.of(17, 30));
//out 2017-xx-xxT17:30
Datetime exemple

 

EXEMPLE 2. Parse & format dates

 

LocalDate ldtParsed= LocalDate.parse("2017-03-29");
		
final DateTimeFormatter MY_PATTERN = 
DateTimeFormatter.ofPattern("dd/MM/yyyy");		

LocalDate dtParsed2 = LocalDate.parse("29/03/2017", MY_PATTERN);
		System.out.println("parse="+dtParsed2);
//out: 2017-03-29	
System.out.println("parse="+dtParsed2.format(MY_PATTERN));

//out: 29/03/2017

 

 

EXEMPLE 3. Plusieurs recherches de date

Comment répondre, par exemple, à ces questions:

  • trouver le premier (dernier) jour du mois courant (ou du mois suivant) ?
  • trouver le premier (dernier) jour de l'année en cours (ou de l'année prochaine) ?
  • trouver le premier jeudi ou dernier jeudi  du mois de juillet ?
  • trouver le prochain vendredi?

Nous vous présentons (hélas sans rappel de la théorie) des exemples qui répondent à certaines de ces questions.

Ces réponses s'articulent autour du design pattern stratégie et l'interface fonctionnelle

java.time.temporal.TemporalAdjuster

Rappelons que les dates sont in-mutables ainsi les résultats des opérations effectuées sur ces dates doivent être récupérés à défaut de les perdre.

import static java.time.temporal.TemporalAdjusters.*;
import static java.time.LocalDate.*;
...
@Test public void  testDateOpByAdjuster(){
LocalDate lDat = of(2017,2,27);	
LocalDate res= lDat.with ( firstDayOfNextMonth());
assertEquals(of(2017, 3, 1), res);
		
res= lDat.with ( firstDayOfNextYear());
assertEquals(of(2018, 1, 1), res);	
assertEquals(DayOfWeek.MONDAY, res.getDayOfWeek());
		
res=lDat.with( t->t.plus(1,ChronoUnit.MONTHS));
assertEquals(of(2017,3,27),res);
LocalDate lDat2 = of(2017,2,28);
res =lDat2.with(  t->t.plus(1,ChronoUnit.MONTHS));
assertEquals(of(2017,3,28),res);
res=res.with(t->t.plus(1,ChronoUnit.YEARS));
assertEquals(of(2018,3,28), res);	
}
test Junit op avec TemporalAdjuster

Donnons quelques explications de ce test Junit:

Les lignes 6 puis 9 effectuent l'opération .with  prenant un TemporalAjuster:

Par exemple lDat.with (TemporalAdjusters.firstDayOfNextMonth) a permis d'identifier la date du premier jour du prochain mois de lDat.

Faisons ainsi, nous avons répondu à l'une des questions posées.

La suite du code est lisible avec opération d'ajout d'un nombre de mois (ou d'années).

Les assertions JUnit vérifient que les résultats obtenus sont conformes.

Si besoin, je reviendrai avec plus de détails sur certains aspects de ce sujet.

Un commentaire

  1. Quelques cookies simples se sont glissés dans le billet!
    Sans doute, vous les avez déjà repérés:-)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.