Avec Java 8, le code ci-dessous analyse "18" en année "0018" au lieu de "2018".
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/y");
return LocalDate.parse(date, formatter);
la date d'entrée est "01/05/18".
1) pourquoi le résultat est "0018"? DateTimeFormatter
ne suit-il pas la règle des 80-20?
2) Comment contrôler SimpleDateFormat parse à 19xx ou 20xx? parlé de SimpleDateFormat.set2DigitYearStart(Date)
peut être utilisé pour fixer l'année. Y a-t-il quelque chose de semblable à celui pour DateTimeFormatter
?
J'espérais que "M/j/y" analysera les années à 2 et 4 chiffres.
"M/j/aa" génère une exception pour les années à 4 chiffres et analyse "01/05/97" à "2097-01-05". Idéalement, cela devrait être analysé comme suit: "1997-01-05".
"M/j/aaaa" lance une exception pour les années à 2 chiffres.
Il n'y a pas une seule chaîne de y
ou u
qui vous permettra d'analyser les années à deux et quatre chiffres. Cependant, vous pouvez utiliser des parties facultatives dans la chaîne de modèle de format pour spécifier qu'une année à deux ou quatre chiffres peut être présente:
public static LocalDate parseDateString(CharSequence date) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/[uuuu][uu]");
return LocalDate.parse(date, formatter);
}
Essayez le:
System.out.println(parseDateString("01/05/18"));
System.out.println(parseDateString("01/06/2018"));
Ce imprimé:
2018-01-05
2018-01-06
Dans la chaîne de modèle de format, vous devez mettre l’année à quatre chiffres en premier. Dans l'ordre inverse, lorsqu'il tente d'analyser une année à quatre chiffres, le formateur analyse deux chiffres, décide que l'opération a réussi jusqu'à présent, puis se plaint du texte non analysé après les deux chiffres.
Si vous souhaitez un contrôle plus précis sur la manière dont les années à deux chiffres sont interprétées:
DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("M/d/")
.optionalStart()
.appendPattern("uuuu")
.optionalEnd()
.optionalStart()
.appendValueReduced(ChronoField.YEAR, 2, 2, 1920)
.optionalEnd()
.toFormatter();
En utilisant ce formateur dans la méthode ci-dessus, essayons:
System.out.println(parseDateString("01/05/22"));
Cela imprime:
1922-01-05
Donner 1920 comme base (comme dans mon exemple de code) fera que deux années de chiffres se termineront dans l'intervalle de 1920 à 2019. Ajustez la valeur selon vos besoins.
Changez votre chaîne de formatage en "M/j/aa"