Pourquoi ne SimpleDateFormat analyser de date incorrect?
J'ai de la date dans un format de chaîne et je veux analyser qu'en util date.
var date ="03/11/2013"
Je suis d'analyse comme suit :
new SimpleDateFormat("MM/dd/yyyy").parse(date)
Mais la chose étrange est que, si je suis de passage "03-08-201309 hjhkjhk" ou "03-88-2013" ou 43-88-201378", il ne renvoie pas d'erreur , il analyse.
Pour cela, je dois écrire une regex modèle pour la vérification de la demande si l'introduction de la date est correcte ou non.
mais pourquoi est-il si ??
Code :
scala> val date="03/88/201309 hjhkjhk"
date: java.lang.String = 03/88/201309 hjhkjhk
scala> new SimpleDateFormat("MM/dd/yyyy").parse(date)
res5: java.util.Date = Mon May 27 00:00:00 IST 201309
var date
? Je ne pense pas, copiez le code réel dans la question, s'il vous plaît.var date
n'est pas Java.- Corne. Je suis en utilisant scala
- Si c'est une option, vous seriez probablement mieux d'utiliser Joda Time (joda-time.sourceforge.net).
- Vous devriez aussi regarder à la Joda Time API qui pourrait bien permettre une interprétation plus restrictive - et est généralement plus propre date/heure API de toute façon.
- Lorsque la question a été posée en 2013, Joda-Temps, c'était une meilleure option que
SimpleDateFormat
à de nombreuses fins. Aujourd'hui (2017) Joda-Time est en mode de maintenance, mais nous avons encore meilleure option dansjava.time
AKA JSR 310. Certes, je vous recommande de jeterSimpleDateFormat
etDate
- dessus de votre épaule.
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
DateFormat.setLenient(false)
:Je ne suis pas certain que cela va attraper tout vous voulez - je crois me souvenir que même avec
setLenient(false)
c'est plus indulgent que vous pourriez vous attendre - mais il doit attraper invalide mois de nombres par exemple.Je ne pense pas qu'il va attraper de fuite de texte, par exemple "03/01/2013 sjsjsj". Vous pouvez éventuellement utiliser la surcharge de
parse
qui accepte unParsePosition
, puis vérifier le courant à analyser index une fois l'analyse terminée:Vous devriez aussi regarder à la Joda Time API qui pourrait bien permettre une interprétation plus restrictive - et est généralement plus propre date/heure API de toute façon.
parse(String text, ParsePosition pos)
version de la méthode d'analyse que vous pouvez ensuite vérifier si tous les commentaires ont été consommés.Jon Skeet réponse est correcte et a été une bonne réponse quand il a été écrit en 2013.
Cependant, les classes que vous utilisez dans votre question,
SimpleDateFormat
etDate
, sont maintenant dépassée depuis longtemps, donc si quelqu'un a eu un problème similaire avec eux aujourd'hui, à mon humble avis, la meilleure réponse serait de modifier à l'aide de le moderne Java date & le temps de l'API.Je suis désolé je ne peut pas écrire de code Scala, de sorte que vous aurez à vivre avec Java. Je suis à l'aide de
Le modèle de format de lettres sont les mêmes que dans votre question, bien que le sens est légèrement différent.
DateTimeFormatter
prend le numéro de modèle de lettres littéralement, comme nous allons le voir. Maintenant, nous essayons:Résultats:
"03/11/2013"
est analysée dans2013-03-11
comme prévu. J'ai utilisé le moderneLocalDate
classe, une classe qui représente une date sans l'heure de la journée, exactement ce dont nous avons besoin ici."03/88/2013 hjhkjhk"
donne unDateTimeParseException
avec le messageText '03/88/2013 hjhkjhk' could not be parsed, unparsed text found at index 10
. Très précis, n'est-ce pas? Moderne, l'API a des méthodes pour analyser uniquement une partie d'une chaîne, si c'est ce que nous voulons, cependant."03/88/201309"
donneText '03/88/201309' could not be parsed at index 6
. Nous avons demandé un 4 chiffres pour l'année et lui a donné 6 chiffres, ce qui conduit à l'objection. Apparemment, il détecte et signale cette erreur avant d'essayer d'interpréter 88 comme un jour de mois."03/88/2013"
donneText '03/88/2013' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 88
. Encore une fois, s'il vous plaît profiter comment informatif, le message est."03-08-2013"
(avec des tirets à la place des barres obliques) donneText '03-08-2013' could not be parsed at index 2
, pas très étonnant. Indice 2 est là que le premier tiret est.Jon Skeet a expliqué que l'ancienne
SimpleDateFormat
peuvent être indulgent ou non clémente. Cela est vrai pourDateTimeFormatter
trop, en fait, il a 3 au lieu de 2 résolveur de styles, appelé ‘clément’, "intelligent" et "stricte". Depuis de nombreux programmeurs ne sont pas conscients de cela, cependant, je pense qu'ils ont fait un bon choix de ne pas faire de ‘clément’ la valeur par défaut ("smart").Que si nous voulions faire de notre formateur clémente?
Maintenant il analyse également
"03/88/2013"
, en2013-05-27
. Je crois que c'est ce que les vieux de la classe ont également fait: comptage de 88 jours à partir du début du mois de Mars donne 27 Mai. Les autres messages d'erreur sont toujours les mêmes. En d'autres termes, il s'oppose encore à unparsed texte, à 6 chiffres pour l'année et pour les traits d'union.Question: puis-je utiliser le moderne API avec ma version de Java?
Si à l'aide d'au moins Java 6, vous pouvez.