我正在尝试解析 yyyyMMddHHmmss 格式的日期。问题是“ss”部分是可选的,所以 “202308301000”和“20230830100005”是可接受的。 我这样定义我的格式化程序:
private static final DateTimeFormatter INPUT_FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("yyyyMMddHHmm")
.optionalStart()
.appendPattern("ss")
.optionalEnd()
.toFormatter();
问题是,对于存在“ss”部分的 20230830100005,它不起作用并失败。我尝试了不同的方法,但无法使其发挥作用......。 有人知道该怎么做吗?
问题是年份部分的宽度可变。模式中的
yyyy
不 匹配 4 位数字,例如模式中的 4 个字符。例如,它接受年份 10000,即使这是 5 个字符。
由于开头有可变宽度,结尾有可选部分,并且没有任何文字来检测字段之间的边界,解析器无法检测我们人类可以直观看到的内容:“2023”是年份部分。
您可以明确定义年份部分恰好是 4 位数字,如下所示:
DateTimeFormatter INPUT_FORMATTER = new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR_OF_ERA, 4)
.appendPattern("MMddHHmm")
.optionalStart()
.appendPattern("ss")
.optionalEnd()
.toFormatter();
1000 年之前的日期需要用 0 填充,10000 年之后的日期不起作用。