6
votes

DateTimeFormatter donnant un format incorrect pour les cas de bord

DateTimeFormatter ne donne pas le format correct pour les 30 et 31 décembre 2018 selon l'extrait de code suivant.

final String DATE_FORMAT = "YYYYMM";
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(DATE_FORMAT);
LocalDateTime startDate = LocalDateTime.of(2018,12,29,5,0,0);
System.out.println(startDate.format(dateFormat));
//prints 201812
LocalDateTime startDate = LocalDateTime.of(2018,12,30,5,0,0);
System.out.println(startDate.format(dateFormat));
//prints 201912 <------ should be 201812
LocalDateTime startDate = LocalDateTime.of(2018,12,31,5,0,0);
System.out.println(startDate.format(dateFormat));
//prints 201912 <------ should be 201812

Est-ce le comportement attendu ou y a-t-il un bogue avec DateTimeFormatter?


7 commentaires

avez-vous recompilé après avoir changé le code?


YYYY est l'année de la semaine, yyyy est l'année


Veuillez lire attentivement SimpleTimeFormatter javadoc . Notez que c'est pour Java 10.


vous devez comprendre le mécanisme de YYYY & yyyy. yyyy spécifie l'année civile tandis que YYYY spécifie l'année (de la "semaine de l'année"), utilisée dans le calendrier ISO année-semaine


Et pour rendre cela encore plus déroutant, il existe d'autres formateurs qui utilisent différents modèles, notamment JodaTime


@HULK Je suis d'accord que cela peut différer d'une langue à l'autre, mais il existe des normes dans chaque langue pour éviter tout conflit. Veuillez lire cette URL - w3.org/TR/NOTE-datetime


@Kandy c'est pourquoi j'ai lié à la très populaire bibliothèque JodaTime qui "est la bibliothèque de date et d'heure standard de facto pour Java avant Java SE 8", et qui gère Y comme année de l'ère (> = 0) - ne supposez rien sur quel analyseur / formateur implémente quelle (partie du) standard à moins qu'il ne documente explicitement la conformité.


3 Réponses :


9
votes

Il s'agit d'un comportement attendu. YYYY signifie "semaine basée sur l'année", qui n'est pas la même chose que l'année civile (voir JavaDoc )

Vous voudrez probablement utiliser yyyy , qui signifie "année de l'ère"


0 commentaires

5
votes

YYYY est l'année de la semaine, yyyy est l'année

Alors changez final String DATE_FORMAT = "YYYYMM"; ro final String DATE_FORMAT = "yyyyMM"; devrait vous donner le résultat correct. Pour plus d'informations sur les modèles, consultez le javadoc de DateTimeFormatter .

La première semaine de 2019 commence le 30 décembre 2018. Pour en savoir plus, consultez ce lien . informations sur les petites années


1 commentaires

@ OleV.V. La documentation de DateFormatter n'était pas très bonne avant la version 7 de Java, j'ai donc aimé utiliser la documentation SimpleDateFormat. J'ai vu qu'il a été changé dans la version Java 8+ Thnks pour l'indication



2
votes

y est pour "l'année de l'ère" tandis que Y est pour week-based-year

Remplacer: p>

final String DATE_FORMAT = "yyyyMM";

à:

final String DATE_FORMAT = "YYYYMM";


0 commentaires