【发布时间】:2021-07-21 15:52:43
【问题描述】:
这看起来是一件很容易实现的事情,但我没有这样做。
我有一个字符串模式 yyyyMMddHH,我正在尝试将 2021061104 解析为 LocalDateTime 的实例
代码如下:
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
class Main {
public static void main(String[] args) {
String pattern = "yyyyMMddHH";
String date = "2021061104";
DateTimeFormatter formatter =
new DateTimeFormatterBuilder()
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.parseLenient()
.appendPattern(pattern)
.toFormatter();
LocalDateTime ldt = LocalDateTime.parse(date, formatter);
}
}
它抛出这个异常:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2021061104' could not be parsed at index 8
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.LocalDateTime.parse(LocalDateTime.java:492)
at Main.main(Main.java:22)
无法解析输入中的HH 字段。
我查看了 javadoc here 但这没有帮助。
为什么会有这个异常?如何解决?
编辑:
我无法删除.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
以下是约束:
- 用户将给
pattern和date(可能是args[0]和args[1]) - 模式必须始终包含日期(年月和日期)
-
pattern中的时间是可选的,最多只能是小时。 - 几个有效模式的示例是:
yyyy-MM-dd HH、yyyy MM dd
由于这些限制,我无法删除 .parseDefaulting(ChronoField.HOUR_OF_DAY, 0),因为如果这样做,我将无法将 yyyy-MM-dd 解析为 LocalDateTime here 的实例
【问题讨论】:
-
为什么不只是
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);? -
这能回答你的问题吗? Parse date-only as LocalDateTime in Java 8
-
您可以使用
new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd[HH]").parseDefaulting(ChronoField.HOUR_OF_DAY, 0).toFormatter();格式的可选部分[]