web-dev-qa-db-fra.com

Pourquoi SimpleDateFormat ("MM / jj / aaaa") analyse la date au 20/10/20128?

J'ai ce code:

  DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
  dateFormat.setLenient(false);
  Date date = dateFormat.parse("10/20/20128");

et je m'attendrais à ce que l'appel dateFormat.parse lève ParseException puisque l'année que je fournis comporte 5 caractères au lieu de 4 comme dans le format que j'ai défini. Mais pour une raison quelconque, même avec la clémence définie sur false, cet appel renvoie un objet Date du 20/10/20128.

Pourquoi donc? Cela n'a pas beaucoup de sens pour moi. Existe-t-il un autre paramètre pour le rendre encore plus strict?

22
goe

20128 est une année valide et Java espère que le monde vivra aussi longtemps, je suppose.

si le nombre de lettres de motif est supérieur à 2, l'année est interprétée littéralement, quel que soit le nombre de chiffres.

Référence.

Si vous souhaitez valider si une date est en limite, vous pouvez en définir une et cocher-

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date maxDate = sdf.parse("01/01/2099");  // This is the limit

if(someDate.after(maxDate)){            
    System.out.println("Invalid date");            
}
39
Sajal Dutta

Voir le javadoc

Année: Si le calendrier du formateur est le calendrier grégorien, les règles suivantes sont appliquées.

  • Pour le formatage, si le nombre de lettres de motif est 2, l'année est tronquée à 2 chiffres; sinon, il est interprété comme un nombre.
  • Pour l'analyse, si le nombre de lettres de modèle est supérieur à 2, l'année est interprétée littéralement , quel que soit le nombre de chiffres. Donc, en utilisant le modèle "MM/dd/yyyy", "01/11/12" analyse le 11 janvier, 12 A.D.
  • Pour l'analyse avec le modèle d'année abrégée ("y" ou "yy"), SimpleDateFormat doit interpréter l'année abrégée par rapport à un siècle. Pour ce faire, il ajuste les dates dans un délai de 80 ans avant et 20 ans après la création de l'instance SimpleDateFormat. Par exemple, en utilisant un modèle de "MM/jj/aa" et un SimpleDateFormat
    instance créée le 1er janvier 1997, la chaîne "01/11/12" serait
    interprété comme le 11 janvier 2012 alors que la chaîne "05/04/64" serait
    interprété comme le 4 mai 1964. Lors de l'analyse, seules les chaînes consistant en
    d'exactement deux chiffres, tels que définis par Character.isDigit (char), sera analysé dans le siècle par défaut. Toute autre chaîne numérique, telle qu'un
    une chaîne à un chiffre, une chaîne à trois chiffres ou plus ou une chaîne à deux chiffres qui ne sont pas tous des chiffres (par exemple, "-1"), est interprétée littéralement.
    Donc, "01/02/3" ou "01/02/003" sont analysés, en utilisant le même modèle que
    2 janv. 3 AD. De même, "01/02/-3" est analysé comme 2 janvier 4 avant JC.
  • Sinon, des formulaires spécifiques au système de calendrier sont appliqués. Pour le formatage et l'analyse, si le nombre de lettres de motif est 4 ou
    plus, un formulaire long spécifique au calendrier est utilisé. Sinon, un calendrier
    une forme abrégée ou abrégée spécifique est utilisée.

Par conséquent, il lira tous les caractères qui viennent après le dernier / comme l'année.

11

Voir Java.text.SimpleDateFormat API, lettre de modèle y: pour l'analyse, si le nombre de lettres de modèle est supérieur à 2, l'année est interprétée littéralement, quel que soit le nombre de chiffres.

7
Evgeniy Dorofeev

En utilisant SimpleDateFormat en Java, vous pouvez obtenir un certain nombre de formats lisibles par l'homme. Considérez cet extrait de code:

        Date curDate = new Date();

        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");

        String DateToStr = format.format(curDate);
        System.out.println(DateToStr);

        format = new SimpleDateFormat("dd-M-yyyy hh:mm:ss");
        DateToStr = format.format(curDate);
        System.out.println(DateToStr);

        format = new SimpleDateFormat("dd MMMM yyyy zzzz", Locale.ENGLISH);
        DateToStr = format.format(curDate);
        System.out.println(DateToStr);

        format = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z");
        DateToStr = format.format(curDate);
        System.out.println(DateToStr);

Regardez les différentes sorties générées par les différents formats:

2014/05/11

11-5-2014 11:11:51

11 mai 2014 Heure d'été d'Europe de l'Est

Dim, 11 mai 2014 23:11:51 EEST

N'hésitez pas à modifier la chaîne de format et vous pourriez obtenir le résultat souhaité.

1
Vishal Kumar