4 pièce(s) jointe(s)
Numéro de semaine dans l'année, DateTimeFormatter, passage de Java 8 à Java 11
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:
Code:
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);
}
} |
Je place la classe Java dans un dossier de Test:
Pièce jointe 509830
Or, le résultat est différent suivant que je sois en Java 8 ou Java 11:
Pièce jointe 509831
Pièce jointe 509834
Pour comprendre pourquoi, il faut avoir en tête les calendriers 2015 et 2016:
Pièce jointe 509842
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.