2016-02-01 32 views
5

To jest naprawdę łatwe do analizowania datę ważności karty debetowej/kredytowej z czasu Joda:Java 8: jak przeanalizować datę ważności karty debetowej?

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); 

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

starałem się zrobić to samo, ale z Java Czas 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); 

wyjściowa:

Spowodowany przez: java.time.DateTimeException: Unabl e, aby uzyskać LocalDate z TemporalAccessor: {MonthOfYear = 2, Year = 2016}, ISO, UTC typu java.time.format.Parsed pod java.time.LocalDate.from (LocalDate.java:368) pod adresem java .time.format.Parsed.query (Parsed.java:226) w java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1851) ... 30 więcej

Gdzie popełniłem błąd i jak go rozwiązać?

+0

Wydaje się lokalną datą mogę być tak szerokie pole jako chciałeś. Lokalny wymaga jednego dnia. – Fallenreaper

Odpowiedz

10

A LocalDate reprezentuje datę, która składa się z roku, miesiąca i dnia. Nie można wykonać LocalDate, jeśli nie zdefiniowano tych trzech pól. W takim przypadku analizujesz miesiąc i rok, ale nie ma dnia. W związku z tym nie można przeanalizować go w postaci LocalDate.

Jeśli dzień nie ma znaczenia, można analizować go w YearMonth obiektu:

YearMonth jest niezmienna obiekt data-czas, który reprezentuje połączenie rok i miesiąc.

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" 
} 

Następnie można przekształcić ten YearMonth w LocalDate poprzez dostosowanie go do pierwszego dnia miesiąca, na przykład:

LocalDate localDate = yearMonth.atDay(1); 
+6

Droga do drogi - choć w przypadku karty kredytowej prawdopodobnie byłaby to "LocalDate expiry = yearMonth.atEndOfMonth();". – assylias

+3

@assylias Prawda, ale działający przykład PO również odnosi się do pierwszego dnia miesiąca. – bowmore

+0

@Tunaki, lub: Date date = new SimpleDateFormat ("MMyy"). Parsowanie ("1016"); LocalDate localDate = LocalDateTime.ofInstant (date.toInstant(), ZoneId.systemDefault()). ToLocalDate(); – user471011