java - 将日期或日期时间都解析为 Java 8 中的 LocalDateTime

标签 java java-8 java-time

我需要解析一个字段,该字段有时以日期形式给出,有时以日期/时间形式给出。是否可以使用 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/

相关文章:

java - 如何将 Java 日期字符串/对象转换为 JFreeChart 日期格式?

java - SWT 按下 ENTER 按钮事件处理程序

Java 8 需要强制转换,而 Java 7 不需要 - enum.getClass/getDeclaringClass

java - Android Facebook 登录回调不起作用

java - 使用下限通配符时出现编译错误

java - lambda 创建后的序列化

java - 如何将 LocalDate 转换为 SQL Date Java?

java - 无法从 HH :mm:ss. SSS'Z' 转换为 HH:MM 格式 Java

java - 如何在 Java 中访问对象 LinkedList 的数据成员的值

java - 获取 Android 中屏幕尺寸 25% 的点