Bonjour,
J'ai un comportement différent suivant que je sois en Java 8 ou Java 11.
Le problème est indirectement évoqué ici:
https://stackoverflow.com/questions/...avior-jdk-8-11
Le but est d'appliquer la norme ISO-8601:
https://fr.wikipedia.org/wiki/Num%C3...O_des_semaines
Voila, soit le code suivant:
Je place la classe Java dans un dossier de Test:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import java.time.*; import java.time.format.DateTimeFormatter; import java.util.*; public class TestMain { public static void main(String[] args) { String test = "2016-01-01T06:00:00.000"; ZonedDateTime testDate = ZonedDateTime.parse(test, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS").withZone(ZoneId.of("UTC"))); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("w").withZone(ZoneId.of("Europe/Paris")).withLocale(Locale.FRENCH); String result = testDate.format(dateTimeFormatter); System.out.println(result); } }
Or, le résultat est différent suivant que je sois en Java 8 ou Java 11:
Pour comprendre pourquoi, il faut avoir en tête les calendriers 2015 et 2016:
En Java 8, il considère que l'on considère que l'on compte la première semaine à partir du premier Lundi de Janvier. Donc la semaine 1 commence le lundi 4/01/2016.
Les 1/01/2016, 2/01/2016 et 3/01/2016 font parties de la semaine 53 de l'année 2015.
Mais en Java 11, il compte à partir du premier jour.
Les 1/01/2016, 2/01/2016 et 3/01/2016 font partie de la semaine 1 de l'année 2016 et la semaine 2 commence le Lundi 4/01/2016.
Cela me pose en particulier dans un test unitaire.
La semaine du 1/02/2016 au 7/02/2016 est la semaine 5 or en Java 11, comme on compte les 1/01/2016, 2/01/2016 et 3/01/2016, ça devient la semaine 6.
La réponse attendu est semaine 5, car c'est la norme ISO 8601
Cordialement.
Partager