2016-02-01 23 views
5

E 'davvero facile da analizzare data di scadenza del debito/carta di credito con il tempo Joda:Java 8: come analizzare la data di scadenza della carta di debito?

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

ho cercato di fare lo stesso, ma con Java Tempo 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); 

uscita:

causato da: java.time.DateTimeException: Unabl e di ottenere LocalDate da TemporalAccessor: {MonthOfYear = 2, Anno = 2016}, ISO, UTC di tipo java.time.format.Parsed a java.time.LocalDate.from (LocalDate.java:368) a java .time.format.Parsed.query (Parsed.java:226) a java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1851) ... 30 more

Dove ho fatto un errore e come risolverlo?

+0

Sembra una data locale cant essere il più ampio campo come tu hai voluto Locale richiede un giorno. – Fallenreaper

risposta

10

A LocalDate rappresenta la data che è composta da un anno, un mese e un giorno. Non è possibile creare un numero LocalDate se non si hanno i tre campi definiti. In questo caso, stai analizzando un mese e un anno, ma non c'è giorno. Pertanto, non è possibile analizzarlo in un numero LocalDate.

Se il giorno è irrilevante, è in grado di analizzare in un oggetto YearMonth:

YearMonth è un oggetto data-ora immutabile che rappresenta la combinazione di un anno e il mese.

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

Si potrebbe quindi trasformare questa YearMonth in un LocalDate regolando al primo giorno del mese, ad esempio:

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

La strada da percorrere, anche se nel caso di una carta di credito sarebbe probabilmente 'Data scadenza locale = yearMonth.atEndOfMonth();'. – assylias

+3

@assylias Vero ma l'esempio di lavoro dell'OP valuta anche il primo del mese. – bowmore

+0

@Tunaki o: Data data = nuovo SimpleDateFormat ("MMyy"). Parse ("1016"); LocalDate localDate = LocalDateTime.ofInstant (date.toInstant(), ZoneId.systemDefault()). ToLocalDate(); – user471011

Problemi correlati