LocalDate和LocalDateTime使用DateTimeFormatter的解析不同格式的问题

LocalDate和LocalDateTime一个是带时间一个不带时间,正常情况下一般的使用如下:

DateTimeFormatter dtf3 = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate localDate1 = LocalDate.parse("20200228", dtf3);
System.out.println(localDate1.format(dtf3));
		
DateTimeFormatter dtf4 = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");
LocalDateTime localDateTime2 = LocalDateTime.parse("20200228 12:12:12", dtf4);
System.out.println(localDateTime2.format(dtf4));

 

但是如果日期中年月日并不完整,例如yyyyMM或MMdd,当使用DateTimeFormatter.ofPattern("yyyyMM")对象来解析成LocalDate 会报错。原因是创建LocalDate需要三个参数,年,月,日

LocalDate和LocalDateTime使用DateTimeFormatter的解析不同格式的问题_第1张图片

用yyyyMM解析将缺少日这个参数。这个时候需要给一个默认值

DateTimeFormatter dtf1 = new DateTimeFormatterBuilder()
                .appendPattern("yyyyMM")
                .parseDefaulting(ChronoField.DAY_OF_MONTH, 20)
                .toFormatter();
LocalDate yearMonth = LocalDate.parse("202002", dtf1);
System.out.println(yearMonth.format(DateTimeFormatter.ofPattern("yyyyMMdd")));

如上使用parseDefaulting方法将缺失的部分默认值设置为20这样解析出来的将会是2020年2月20日。

LocalDateTime的构造原理是LocalDate和LocalTime对象的组合

LocalDate和LocalDateTime使用DateTimeFormatter的解析不同格式的问题_第2张图片

自然LocalDateTime对象的创建不能缺少年月日,而LocalTime的创建当只传小时,分钟时,秒和毫秒默认为0

LocalDate和LocalDateTime使用DateTimeFormatter的解析不同格式的问题_第3张图片

如下代码

DateTimeFormatter dtf2 = new DateTimeFormatterBuilder()
                .appendPattern("HHmm")
                .parseDefaulting(ChronoField.YEAR, 2002)
                .parseDefaulting(ChronoField.DAY_OF_YEAR, 300)//一年中的第几天,自然就不需要月了
                .toFormatter();
LocalDateTime localDateTime = LocalDateTime.parse("0830", dtf2);
System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss:SSS")));

结果为20021027 08:30:00:000

 

 

 

你可能感兴趣的:(Java)