Vérifiez la date et l'heure réelles lors de l'analyse avec SimpleDateFormat de Java

Les dates inexistantes sont analysées

Échantillon avec un codage minimal.

normal


String target = "2019/07/20 12:34:56";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
try{
    Date result = sdf.parse(target);
    System.out.println(sdf.format(result));
}catch(ParseException e){
    e.printStackTrace();
}
2019/07/20 12:34:56

L'analyse et le formatage sont exécutés en fonction de la valeur «String» saisie.

Ici, nous vérifierons le comportement lorsque la valeur de String est définie sur 2020/27/72 72: 72: 72. Dans un processus qui analyse généralement, comme cette valeur, la date et l'heure qui n'existent pas, Données de date et d'heure qui ne peuvent pas être affichées sur le calendrier ou l'horloge Vous voulez faire échouer l'analyse en tant qu'entrée anormale. Cet article est écrit pour cette exigence.

abnormal


String target = "2020/27/72 72:72:72";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
try {
    Date result = sdf.parse(target);
    System.out.println(sdf.format(result));
} catch (ParseException e) {
    e.printStackTrace();
}
2022/05/14 01:13:12

En termes de comportement, la conversion se fait comme ça sans lancer une ParseException.

Je ne veux pas analyser de telles données

En une seule étape, il est possible de vérifier si la date et l'heure existent réellement.

1 étape ajoutée


String target = "2020/27/72 72:72:72";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
/* setLinient(boolean)Ajouter un appel à*/
sdf.setLenient(false);
try {
    Date result = sdf.parse(target);
    System.out.println(sdf.format(result));
} catch (ParseException e) {
    e.printStackTrace();
}
java.text.ParseException: Unparseable date: "2020/27/72 72:72:72"
	at java.text.DateFormat.parse(DateFormat.java:366)
	at ...

Il lancera une ParseException, donc Comme pour les autres cas de valeurs d'entrée non valides (dans cet exemple d'implémentation, «20 juillet 1ère année de Reiwa»), Vous pouvez y faire face en sélectionnant des exceptions. Comment y faire face dépend des exigences de mise en œuvre, donc je n'y reviendrai pas.

Si vous voulez savoir comment gérer le codage, c'est la fin. Après cela, j'ai essayé d'explorer l'arrière-plan de la méthode appelée.


2020/27/72 72:72:72 = 2022/05/14 01:13:12? Une explication légère de la raison pour laquelle les données données dans l'exemple de code ci-dessus sont à cette date et heure. Vérifiez uniquement la partie horaire de la date et de l'heure. 72:00 = 24 heures x 3 72 minutes = 60 minutes x 1 + 12 minutes 72 secondes = 60 secondes x 1 + 12 secondes → (12 secondes + 1 minute) + (12 minutes + 1 heure) + 3 jours → 12 secondes + 13 minutes + 1 heure De même, la valeur de trois jours est incluse dans la partie date et le montant qui déborde de chaque mois est inclus.

Confirmation de la description dans les spécifications Java

Vérifiez la description dans API Java8 (SimpleDateFormat).

Vérifiez les spécifications pour le nombre de chiffres dans la valeur d'entrée

Étant donné que «aaaa / MM / jj HH: mm: ss» »est spécifié comme format, MM est 2 chiffres, jj est également 2 chiffres ... Sinon, ce sera NG? C'est comme une illusion, alors vérifiez-le.

input


SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
sdf.setLenient(false);
String zeropad = "2019/01/02 03:04:05";  //La partie à 1 chiffre est également remplie de 0 pour qu'elle devienne 2 chiffres.
String lessdig = "2019/1/2 3:4:5";   //Pas de remplissage à 0 pour 1 chiffre
try{
    sdf.parse(zeropad);
    sdf.parse(lessdig);
...
(ParseException ne se produit pas)

Ce comportement est décrit dans l'API.

Numérique: lors du formatage, le nombre de caractères du motif est le nombre minimum de chiffres. Les nombres plus courts que cela sont complétés par zéro à ce nombre de chiffres. Le nombre de caractères de modèle est ignoré pour l'analyse, sauf si vous devez séparer deux champs adjacents.

** Le nombre de caractères est ignoré **.

Spécifications de vérification de la date et de l'heure d'existence des valeurs d'entrée

Pour le contrôle de date par défaut de parse (String) (expression telle que "analyse stricte" sur l'API) Il y avait une description dans DateFormat API, qui est une super classe de SimpleDateFormat.

Par défaut, l'analyse n'est pas rigoureuse. Si l'entrée n'est pas au format utilisé par la méthode de format de cet objet, mais peut être analysée comme une date, l'analyse réussit.

SimpleDateFormat.parse(String) → DateFormat.parse(String) → DateFormat.parse(String, ParsePosition) J'ai pu arriver à la description dans le flux.

Suite à la description de cette API et à la phrase ci-dessus, il a été écrit comme ceci.

Le client peut strictement demander ce format en appelant setLenient (false).

Je vois, l'API est le document le plus solide.

Qui est setLenient (false)

En conclusion, c'est une méthode de la classe Calendar. Calendar.setLinient(boolean)

Définissez s'il faut interpréter strictement la date / l'heure. (Omis) La valeur par défaut est non stricte.

Cela passe «true» si cela permet la non-rigueur, et «false» si c'est strictement le cas. Parce que le mot clément signifie «lâche» Il correspond aux arguments "loose (true)" et "not loose (false)".

Le contrôle de la date réelle peut être facilement implémenté avec setLenient ()

À répéter en quelques mots

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
sdf.setLenient(false);

Seule une analyse rigoureuse des dates est effectuée.

Recommended Posts

Vérifiez la date et l'heure réelles lors de l'analyse avec SimpleDateFormat de Java
Exemple de code pour analyser la date et l'heure avec SimpleDateFormat de Java
Réglez la date et l'heure à partir de la chaîne de caractères avec POI
Vérifier quand moss avec SimpleDateFormat parse
Le concept de conception de l'API de date et d'heure de Java est intéressant
Dessinez un graphique à barres et un graphique linéaire en même temps avec MPAndroidChart
Date et l'heure
Mettre en forme la date et l'heure données par created_at
Analyser en Java les chaînes de date et d'heure formatées par la fonction asctime du langage C
Comparaison de vitesse au moment de la génération au moment de la conversion de la date
Comportement remarqué lors de l'ajout de RadioButton et de la vérification initiale en même temps dans le code
[Rails] Précautions lors de la comparaison de la date et de l'heure avec DateTime
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
Qu'est-ce que la classe LocalDateTime? [Java débutant] -Date et classe d'heure-
[Java] Vérifiez la différence entre orElse et orElseGet avec IntStream
[Java] Utilisez ResolverStyle.LENIENT pour bien gérer la date et l'heure
[Rails] Obtenez access_token au moment de l'authentification Twitter avec Sorcery et enregistrez-le dans la base de données
Obtenez la date et l'heure actuelles en spécifiant le fuseau horaire dans Thymeleaf
La relation entre la vérification stricte de la date Java et l'heure d'été
[MySQL] [java] Date et heure de réception
Les débutants créent des applications Web avec Java et MySQL (ajout à tout moment)
[Spring Boot] Publiez des fichiers et d'autres données en même temps [Axios]
Au moment de la nouvelle inscription, fonction d'envoi de courrier avec Action Mailer
[Android] Vérifiez la machine réelle sans bouger les mains grâce au défilement automatique
J'étais coincé avec la gestion des fuseaux horaires lors du formatage avec SimpleDateFormat