一个日期时间格式化程序适用于 2 种情况

问题描述 投票:0回答:1

我正在尝试解析 yyyyMMddHHmmss 格式的日期。问题是“ss”部分是可选的,所以 “202308301000”和“20230830100005”是可接受的。 我这样定义我的格式化程序:

    private static final DateTimeFormatter INPUT_FORMATTER = new DateTimeFormatterBuilder()
        .appendPattern("yyyyMMddHHmm")
        .optionalStart()
        .appendPattern("ss")
        .optionalEnd()
        .toFormatter();

问题是,对于存在“ss”部分的 20230830100005,它不起作用并失败。我尝试了不同的方法,但无法使其发挥作用......。 有人知道该怎么做吗?

java datetime-format java-time
1个回答
0
投票

问题是年份部分的宽度可变。模式中的

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 年之后的日期不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.