Java 8 LocalDateTime analyse date non valide
Je voulais valider la date à côté client donc j'ai écrit le code suivant. Mais au lieu de recevoir une exception, je suis d'avoir un bon objet date pour le 31 du mois de février chaîne de date, ce qui est clairement une date non valide.
public class Test {
public static void main(String[] args) {
String dateFormat = "HH:mm:ss MM/dd/yyyy";
String dateString = "11:30:59 02/31/2015";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormat, Locale.US);
try {
LocalDateTime date = LocalDateTime.parse(dateString, dateTimeFormatter);
System.out.println(date);
} catch (Exception e) {
//Throw invalid date message
}
}
}
Sortie : 2015-02-28T11:30:59
Personne ne sait pourquoi LocalDateTime
est l'analyse de cette date au lieu de lancer une exception.
pourquoi êtes-vous en attente d'une exception?
sans doute parce que le 31 Février. n'existe pas.
Mais formateur ne sais pas à ce sujet.
Ce qui vous fait penser à qui? Quelque chose sait très bien que le jour n'existe pas, que c'est de la convertir dans le 28...
Mes excuses pour vous induire en erreur plus tôt, le problème n'est pas le manque de millisecondes. C'est en fait le manque Ère. Il nécessite encore un
sans doute parce que le 31 Février. n'existe pas.
Mais formateur ne sais pas à ce sujet.
Ce qui vous fait penser à qui? Quelque chose sait très bien que le jour n'existe pas, que c'est de la convertir dans le 28...
Mes excuses pour vous induire en erreur plus tôt, le problème n'est pas le manque de millisecondes. C'est en fait le manque Ère. Il nécessite encore un
DateTimeFormatterBuilder
mais avec une valeur par défaut pour l'Époque, pas de millisecondes. Si vous souhaitez modifier & undelete votre réponse, n'hésitez pas.OriginalL'auteur Zeeshan | 2015-09-28
Vous devez vous connecter pour publier un commentaire.
Vous avez juste besoin d'un strict
ResolverStyle
.Exemple de code - où
withResolverStyle(ResolverStyle.STRICT)
est l'importance du changement, avec l'utilisation deuuuu
plutôt queyyyy
(oùuuuu
est "an" et "yyyy" est "l'année de l'ère", et donc ambigu):Aha! Bien fait, merci.
OriginalL'auteur Jon Skeet
La Java 8 DateTimeFormatter utilise aaaa à dire YEAR_OF_ERA, et uuuu à la moyenne de l'ANNÉE. Vous avez besoin de modifier votre modèle de chaîne de caractères comme suit:
DateTimeFormatter par défaut à l'aide de la PUCE de résolution de style, mais vous voulez qu'il utilise le STRICT résolveur de style. Modifier votre dateTimeFormatter code d'initialisation comme suit:
OriginalL'auteur Palamino
Il n'est pas arrondi vers le bas. Février n'a jamais eu de 31 jours, et il est impossible d'utiliser une validation de la date /heure de l'objet à représenter un jour qui n'existe pas.
Comme un résultat, il faut de l'entrée non valide et vous donne la meilleure approximation à la bonne date (la date du dernier jour de février de cette année).
SimpleDateFormat
hérite deDateFormat
qui a unsetLenient(boolean value)
méthode. Je m'attends à ce que si vous l'avez appelésetLenient(true)
avant l'analyse, il serait probablement se plaindre plus, comme détaillé dans la documentation javadoc.OriginalL'auteur Edwin Buck
J'ai trouvé une solution à reconnaître date une date valide avec DateFormat.setLenient(boolean). Si vous essayez d'analyser toute date non valide il jette analyser exception.
Edit:
Java 8
, mais cela va lever une exception si le mois n'est pas entre1
et12
, si un jour est plus de32
. Exactement pas de travail. Mais pour les mois de travail.De sortie:
SimpleDateFormat
ne fonctionne pas avec Java 8LocalDateTime
. Je suis à la recherche d'une solution avec Java8 LocalDateTimeOriginalL'auteur SatyaTNV
LocalDateTime.parse ne peut lever une erreur si la Chaîne passée en contient des caractères non valides, un certain nombre de jours excédant 31 ou un mois de plus de 12.
Par exemple, si vous avez modifié votre code en tant que tel:
une exception sera levée causés par le non valide " zz " caractères à l'intérieur de votre date donnée. Pourquoi c'est "arrondi vers le bas" à la date de leur dire, que je ne sais pas.
Source: https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#parse-java.lang.CharSequence-
OriginalL'auteur jste89