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?
3 Réponses :
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"
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
@ 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
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";
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
commeanné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é.