web-dev-qa-db-fra.com

Java 8 DateTimeFormatter année à deux chiffres 18 analysé à 0018 au lieu de 2018?

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.

6
Jesse Zhuang

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.

9
Ole V.V.

Changez votre chaîne de formatage en "M/j/aa"

0
Vishal Raja