【问题标题】:Parsing day of month with one digit in Java在Java中用一位数字解析月份中的某一天
【发布时间】:2021-08-02 22:41:20
【问题描述】:

我想将字符串“OCTOBER81984”解析为 Java LocalDate。我正在使用以下代码,但不起作用

LocalDate.parse("OCTOBER81984",
    new DateTimeFormatterBuilder() 
         .parseCaseInsensitive()
         .appendPattern("MMMMdyyyy")
         .toFormatter(Locale.US)
);

例外是

Exception in thread "main" java.time.format.DateTimeParseException: Text 'OCTOBER81984' could not be parsed at index 12
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.LocalDate.parse(LocalDate.java:400)

使用的模式是

MMMM --> Full month name
d    --> Day of month with 1 or 2 digits
yyyy --> Year

我已阅读the docs 两次,我的模式看起来不错,但实际上不起作用。

我错过了什么?

【问题讨论】:

  • “但真的不起作用” - 这是什么意思?不编译?抛出异常?返回意外结果?

标签: java parsing localdate


【解决方案1】:

问题是您有 2 个可变宽度字段,即日期和年份。解析器不够聪明,无法确定您的字符串并不表示 984 年 10 月 81 日 (OCTOBER-81-984)。

这是一个示例,您认为知道 10 月 81 日是胡言乱语可能足够聪明,但假设您的输入是 OCTOBER11984。很可能是 984 年 11 月 11 日。

如果您可以处理添加的约束,即年份必须为 4 位数字,则解析器可以容忍月份中的日期不是固定宽度的事实。

试试这个:

LocalDate.parse("OCTOBER81984", 
    new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendPattern("MMMM") // or .appendText(ChronoField.MONTH_OF_YEAR)
        .appendValue(ChronoField.DAY_OF_MONTH, 1, 2, SignStyle.NEVER)
        .appendValue(ChronoField.YEAR_OF_ERA, 4)
        .toFormatter(Locale.US)
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多