SimpleDateFormat ne rejette pas manquer l'entrée siècle sur l'année de l'entrée, en dépit de « yyyy » dans le modèle de formatage
-
08-10-2019 - |
Question
J'ai un SimpleDateFormat avec le motif yyyy-M-d"
, et le scénario suivant:
String str = "02-03-04";
SimpleDateFormat f = new SimpleDateFormat("yyyy-M-d");
f.setLenient(false);
System.out.println(f.parse(str));
La sortie est Sat Mar 04 00:00:00 EST 2
Mon objectif était de rattraper que les dates au format comme 2004-02-03 et d'ignorer 02-03-04. Je pensais que le yyyy dans le modèle nécessiterait un quatre chiffres de l'année, mais il est clair ce n'est pas le cas. Quelqu'un peut-il expliquer pourquoi cela ne jette une exception d'analyse syntaxique? Je voudrais à ...
La solution
Eh bien, je peux l'expliquer de la docs :
Pour l'analyse, si le nombre de lettres de motif est plus de 2, l'année est interprété littéralement, quel que soit le nombre de chiffres. Donc, en utilisant le modèle "MM / jj / aaaa", "01/11/12" Parsis à 11 janvier 12 ap. J.-C..
Il est possible que Joda temps serait plus stricte - et il est une meilleure API en général, l'OMI .. .
Vous pouvez toujours lancer une exception si l'année est inférieure à 1000 après l'analyse syntaxique ...
Autres conseils
tl; dr
Utilisation java.time , cette entrée avec ce modèle de formatage échoue, tout comme prévu.
LocalDate
.parse(
"02-03-04" ,
DateTimeFormatter.ofPattern ( "uuuu-M-d" )
)
... jette java.time.format.DateTimeParseException
java.time
Les classes que vous utilisez sont désormais supplantés par les modernes java.time classes définies dans JSR 310 et construit en Java 8 et versions ultérieures.
Le LocalDate
classe représente une valeur de date uniquement, sans temps de jour et sans fuseau horaire ou offset de-UTC .
Définir un modèle de formatage personnalisé que vous avez demandé. Utilisez le DateTimeFormatter
classe .
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuu-M-d" );
Essayez d'analyser votre entrée.
String input = "02-03-04";
LocalDate localDate = LocalDate.parse ( input , f );
Nous rencontrons un DateTimeParseException
, à défaut sur les disparus siècle de l'année de l'entrée. Tout comme prévu.
Exception dans le thread "principal" java.time.format.DateTimeParseException: Texte '02 -03-04' n'a pas pu être analysée à l'index 0
A propos de java.time
classes date de temps de hérités tels que java.util.Date
, Calendar
, & SimpleDateFormat
.
Pour en savoir plus, consultez le Oracle Tutorial . Et la recherche Stack Overflow pour de nombreux exemples et explications. Spécification est JSR 310 .
Le projet Joda-Time , maintenant < a href = "https://en.wikipedia.org/wiki/Maintenance_mode" rel = "nofollow noreferrer"> mode maintenance , conseille la migration vers la page java.time classes.
Vous pouvez échanger des java.time objets directement avec votre base de données. Utilisez un pilote JDBC conforme JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de classes java.sql.*
.
Où obtenir les classes java.time?
- Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 , et plus tard - Une partie de l'API Java standard avec une implémentation groupée.
- Java 9 ajoute quelques fonctionnalités mineures et corrections.
- Java SE 6 et Java SE 7
- La plupart des java.time fonctionnalité est de retour à Java 6 Ported & 7 Android
- Les versions ultérieures de bundle implémentations Android du java.time classes.
- Pour plus tôt Android (<26), ThreeTenABP projet ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP ... .
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour des ajouts futurs possibles à java.time. Vous trouverez peut-être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus . - La plupart des java.time fonctionnalité est de retour à Java 6 Ported & 7 Android