Java 8:如何解析借记卡的到期日期?

时间:2016-02-01 14:53:01

标签: java java-8 jodatime java-time

用Joda时间解析借记卡/信用卡的到期日期真的很容易:

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

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

我尝试使用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);

输出:

  

引起:java.time.DateTimeException:无法获取LocalDate   来自TemporalAccessor:{MonthOfYear = 2,Year = 2016},ISO,UTC类型   java.time.format.Parsed at   java.time.LocalDate.from(LocalDate.java:368)at   java.time.format.Parsed.query(Parsed.java:226)at   java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)     ......还有30多个

我犯了错误以及如何解决?

1 个答案:

答案 0 :(得分:11)

LocalDate表示由年,月和日组成的日期。如果您没有定义这三个字段,则无法生成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"
}

然后,您可以将此YearMonth转换为LocalDate,将其调整为该月的第一天,例如:

LocalDate localDate = yearMonth.atDay(1);