2016-02-01 13 views
5

O Joda zamanla banka/kredi kartının son kullanma tarihini ayrıştırmak için gerçekten çok kolay: 2016-02-01T00:00:00.000ZJava 8: Banka kartının son kullanma tarihi nasıl ayrıştırılır?

Aynı şeyi denedik ama Java Zaman API ile:

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

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

Çıktı: java.time.DateTimeException: neden Olduğu

Unabl Java az {MonthOfYear = 2, = 2016 yıl}, ISO tip java.time.format.Parsed bölgesinin UTC java.time.LocalDate.from (LocalDate.java:368) de: e TemporalAccessor gelen LOCALDATE elde etmek üzere .time.format.Parsed.query java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1851) 'den (Parsed.java:226) ... 30 ben bir hata yaptım daha

ve nasıl çözülür? Bir yıl, bir ay ve bir günden oluşan bir tarihi temsil eder.

+0

olduğunca geniş bir alan olamaz yerel bir tarih gibi görünüyor sen istedin Yerel bir gün gerektirir. – Fallenreaper

cevap

10

LocalDate. Tanımlanmış üç alana sahip değilseniz, LocalDate yapamazsınız. Bu durumda, bir ay ve bir yıl ayrıştırıyorsunuz, ancak gün yok. Bu nedenle, onu LocalDate'da ayrıştıramazsınız. gün alakasız ise

, bir YearMonth nesnesine ayrıştırmak olabilir:

YearMonth bir yıl ve ay kombinasyonunu temsil eden bir değişmez tarih-saat nesnedir.

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

Ardından örneğin ayın ilk günü onu ayarlayarak bir LocalDate içine bu YearMonth dönüştürebilir:

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

Gitmek için bir yol - bir kredi kartı olması durumunda muhtemelen "LocalDate expiry = yearMonth.atEndOfMonth();' olacaktır. – assylias

+3

@assylias Doğru ama OP'nin çalışma örneği de ayın ilkine göre değerlendiriliyor. – bowmore

+0

@Tunaki, veya: Tarih date = new SimpleDateFormat ("MMyy") ayrıştırma ("1016"); LocalDate localDate = LocalDateTime.ofInstant (date.toInstant(), ZoneId.systemDefault()) toLocalDate(); – user471011