2016-02-01 5 views
5

ジョダ時間でデビット/クレジットカードの有効期限を解析するのはとても簡単です:2016-02-01T00:00:00.000ZJava 8:デビットカードの有効期限を解析する方法は?

は、私は同じことを実行しようとしましたが、JavaタイムAPIで:

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

うち

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

出力:

原因:java.time.DateTimeException:Unabl e: のTemporalAccessor:{MonthOfYear = 2、Year = 2016}、ISO、UTCからLocalDate を取得します。 で解析されたjava.time.format.Parsed java.time.LocalDate.from(LocalDate.java:368) java私はミスを犯した java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) で.time.format.Parsed.query(Parsed.java:226)... 30もっと

それを解決する方法は?

+0

同じくらい幅広いフィールドでカントのローカルな日付のように思えますあなたが望んでいた。現地では1日が必要です。 – Fallenreaper

答えて

10

LocalDateは、年、月、および日で構成される日付を表します。これらの3つのフィールドが定義されていない場合は、LocalDateを作成することはできません。この場合、月と年を解析していますが、日はありません。したがって、LocalDateで解析することはできません。

日が無関係である場合、あなたはYearMonthオブジェクトにそれを解析できます。

YearMonthは年と月の組み合わせを表し不変日付時刻オブジェクトです。

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

その後、例えば月の最初の日にそれを調整することにより、LocalDateにこのYearMonthを変換することができます:

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

行く方法 - クレジットカードの場合は、おそらく 'LocalDate expiry = yearMonth.atEndOfMonth();'になります。 – assylias

+3

@assylias Trueですが、OPの動作例も月の初めに評価されます。 – bowmore

+0

@ Tunaki、または:Date date = new SimpleDateFormat( "MMyy")。parse( "1016"); LocalDate localDate = LocalDateTime.ofInstant(date.toInstant()、ZoneId.systemDefault())。toLocalDate(); – user471011

関連する問題