web-dev-qa-db-fra.com

Faites en sorte que SimpleDateFormat.parse () échoue aux dates non valides (le mois est supérieur à 12, par exemple)

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.

48
Sergio Acosta

Vous devez le faire non-indulgent . Ainsi,

format.setLenient(false);

devrait le faire.

108
BalusC

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
4
Ortomala Lokni

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
1
Arvind Katte