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

时间:2015-04-15 08:12:18

标签: java java-8 java-time

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

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

我如何解析这种特定格式?

谢谢。

3 个答案:

答案 0 :(得分: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"用于解析)

答案 1 :(得分:2)

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

答案 2 :(得分:-1)

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