J'utilise Java.text.SimpleDateFormat
pour analyser les chaînes de la forme "yyyyMMdd"
.
Si j'essaie d'analyser une chaîne avec un mois supérieur à 12, au lieu d'échouer, elle se répercute sur l'année suivante. Repro complète exécutable:
import Java.text.ParseException;
import Java.text.SimpleDateFormat;
import Java.util.Date;
public class ParseDateTest {
public static void main(String[] args) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
Date result = format.parse("20091504"); // <- should not be a valid date!
System.out.println(result); // prints Thu Mar 04 00:00:00 CST 2010
}
}
Je préférerais avoir un ParseException
jeté.
Existe-t-il un moyen non astucieux de forcer l'exception à se produire ?. Je veux dire, je ne veux pas vérifier manuellement si le mois est supérieur à 12 ans. C'est un peu ridicule.
Merci pour toute suggestion.
NOTE: Je connais déjà Joda Time, mais j’ai besoin que cela soit fait en JDK sans bibliothèques externes.
Vous pouvez utiliser l'API temporelle Java 8. Si, par exemple, vous utilisez un mois avec la valeur 15
:
String strDate = "20091504";
TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate);
Vous aurez directement une exception
Exception in thread "main" Java.time.format.DateTimeParseException:
Text '20091504' could not be parsed:
Invalid value for MonthOfYear (valid values 1 - 12): 15
En utilisant Java 8 LocalDate
vous pouvez écrire comme ceci,
String strDate = "20091504";
LocalDate date1 = LocalDate.parse(strDate, DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(date1);
Voici l'exception est levée lors de l'analyse
Exception in thread "main" Java.time.format.DateTimeParseException: Text '20091504' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 15
at Java.time.format.DateTimeFormatter.createError(Unknown Source)
at Java.time.format.DateTimeFormatter.parse(Unknown Source)
at Java.time.LocalDate.parse(Unknown Source)
at com.katte.infa.DateFormatDemo.main(DateFormatDemo.Java:22)
Caused by: Java.time.DateTimeException: Invalid value for MonthOfYear (valid values 1 - 12): 15
at Java.time.temporal.ValueRange.checkValidIntValue(Unknown Source)
at Java.time.temporal.ChronoField.checkValidIntValue(Unknown Source)
at Java.time.chrono.IsoChronology.resolveYMD(Unknown Source)
at Java.time.chrono.IsoChronology.resolveYMD(Unknown Source)
at Java.time.chrono.AbstractChronology.resolveDate(Unknown Source)
at Java.time.chrono.IsoChronology.resolveDate(Unknown Source)
at Java.time.chrono.IsoChronology.resolveDate(Unknown Source)
at Java.time.format.Parsed.resolveDateFields(Unknown Source)
at Java.time.format.Parsed.resolveFields(Unknown Source)
at Java.time.format.Parsed.resolve(Unknown Source)
at Java.time.format.DateTimeParseContext.toResolved(Unknown Source)
at Java.time.format.DateTimeFormatter.parseResolved0(Unknown Source)
... 3 more