Java 8: Comment analyser la date d'expiration de la carte de débit?


Il est vraiment facile d'analyser la date d'expiration de la carte de débit / crédit avec Joda time:

org.joda.time.format.DateTimeFormatter dateTimeFormatter = org.joda.time.format.DateTimeFormat.forPattern("MMyy").withZone(DateTimeZone.forID("UTC"));
org.joda.time.DateTime jodaDateTime = dateTimeFormatter.parseDateTime("0216");
System.out.println(jodaDateTime);

Sortie: 2016-02-01T00:00:00.000Z

J'ai essayé de faire la même chose mais avec Java Time API:

java.time.format.DateTimeFormatter formatter = java.time.format.DateTimeFormatter.ofPattern("MMyy").withZone(ZoneId.of("UTC"));
java.time.LocalDate localDate = java.time.LocalDate.parse("0216", formatter);
System.out.println(localDate);

Sortie:

Causé par: java.temps.DateTimeException: Impossible d'obtenir LocalDate depuis TemporalAccessor: {MonthOfYear=2, Year=2016}, ISO, UTC de type Java.temps.format.Analysée à Java.temps.LocalDate.à partir de(LocalDate.java:368) à Java.temps.format.Analyser.requête (analysée.java:226) à Java.temps.format.DateTimeFormatter.analyse (DateTimeFormatter.java:1851) ... 30 plus

, Où j'ai fait une erreur et comment la résoudre?

Author: Tunaki, 2016-02-01

1 answers

Un LocalDate représente la date qui est composé d'un an, un mois et un jour. Vous ne pouvez pas créer un LocalDate si ces trois champs ne sont pas définis. Dans ce cas, vous analysez un mois et un an, mais il n'y a pas de jour. En tant que tel, vous ne pouvez pas l'analyser dans un LocalDate.

Si le jour est sans pertinence, vous pouvez analyser dans un YearMonth objet:

YearMonth est un objet date-heure immuable qui représente la combinaison d'une année et mois.

public static void main(String[] args) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMyy").withZone(ZoneId.of("UTC"));
    YearMonth yearMonth = YearMonth.parse("0216", formatter);
    System.out.println(yearMonth); // prints "2016-02"
}

Vous pouvez ensuite transformer ce YearMonth en LocalDate réglage pour le premier jour du mois, par exemple:

LocalDate localDate = yearMonth.atDay(1);
 11
Author: Tunaki, 2016-02-01 14:57:17