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

StackOverflow https://stackoverflow.com/questions/4410524

  •  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 à ...

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top