使用 DateTimeFormatter 解析没有月份的日期

Parsing date without month using DateTimeFormatter

我尝试用这种格式解析日期:ddYYYY。例如,我有字符串 141968,我想知道 day = 14year = 1968.

我想我必须直接使用 DateTimeFormatter.parse(String) 给出的 TemporalAccessor,但我找不到如何使用这个结果。在调试时,我看到结果是 java.time.Parsed,它不是 public,但在字段 fieldValues 中包含我想要的信息。

如何解析这种特殊格式?

谢谢。

SimpleDateFormat sdf = new SimpleDateFormat("ddyyyy");
Date DateToStr = sdf.parse("141968");// To convert to date Date object
sdf = new SimpleDateFormat("dd/yyyy"); // Separating by '/'
System.out.println(sdf.format(DateToStr));

输出 14/1968

YYYY 生成一个 WeakBasedYear 字段,无法从 TemporalAccessor 轻松访问 (https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns)。 您必须将模式 "ddyyyy" 或 "dduuuu" 与 DateTimeFormatter 一起使用才能使用 ChronoField.YEAR

TemporalAccessor parsed = DateTimeFormatter.ofPattern("ddyyyy").parse("141968");
System.out.println(parsed.get(ChronoField.YEAR));
System.out.println(parsed.get(ChronoField.DAY_OF_MONTH));

输出:

1968
14

一种方法是默认缺少月份字段:

DateTimeFormatter f = new DateTimeFormatterBuilder()
  .appendPattern("ddyyyy")
  .parseDefaulting(MONTH_OF_YEAR, 1)
  .toFormatter();
LocalDate date = LocalDate.parse("141968", f);
System.out.println(date.getDayOfMonth());
System.out.println(date.getYear());

另一种是查询TemporalAccessor:

DateTimeFormatter f = DateTimeFormatter.ofPattern("ddyyyy");
TemporalAccessor parsed = f.parse("141968");
System.out.println(parsed.get(ChronoField.YEAR));
System.out.println(parsed.get(ChronoField.DAY_OF_MONTH));

(注意使用"y",而不是"Y"进行解析)