É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
.
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.
Vérifiez la description dans API Java8 (SimpleDateFormat).
É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é **.
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.
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)".
À 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