我需要解析一个字段,该字段有时以日期形式给出,有时以日期/时间形式给出。是否可以使用 Java 8 时间 API 为此使用单一数据类型?
目前,我试图为它使用 LocalDateTime,但对于后续调用 LocalDateTime.parse("1986-04-08", DateTimeFormatter.ofPattern("yyyy-MM-dd"))
我得到一个
java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 1986-04-08 of type java.time.format.Parsed
这是一些接受日期/日期时间解析模式作为配置选项的通用解析器的一部分。所以例如以下具有硬编码解析模式的解决方案
if ("yyyy-MM-dd".equals(pattern)) {
LocalDate.parse(value, DateTimeFormatter.ofPattern("yyyy-MM-dd"))).atStartOfDay()
}
对我来说不是一个选择。
欢迎提出如何以简洁的方式编写代码的任何其他建议。
最佳答案
只需使用构建器创建自定义格式化程序 DateTimeFormatterBuilder
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd[ HH:mm:ss]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
此格式化程序使用 []
括号允许格式中的可选部分,并添加小时 HOUR_OF_DAY
、分钟 MINUTE_OF_HOUR
的默认值第二个 SECOND_OF_MINUTE
。
注意:你可以省略,分和秒,只要提供小时就够了。
照常使用。
LocalDateTime localDateTime1 = LocalDateTime.parse("1994-05-13", formatter);
LocalDateTime localDateTime2 = LocalDateTime.parse("1994-05-13 23:00:00", formatter);
这会输出正确的日期时间,默认时间为 0(一天的开始)。
System.out.println(localDateTime1); // 1994-05-13T00:00
System.out.println(localDateTime2); // 1994-05-13T23:00
关于java - 将日期或日期时间都解析为 Java 8 中的 LocalDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49323017/