Java8 日期 api - 将 20240230 输出为 20240230,而不是 2024 年 2 月 28 日

问题描述 投票:0回答:1
    String valueDate(String valueDate_yyyyMMdd) {
        final DateTimeFormatter DATE_FORMATTER_YYYYMMDD = DateTimeFormatter.ofPattern("yyyyMMdd")
        try {
            final LocalDate valueDate = LocalDate.parse(StringUtils.trim(valueDate_yyyyMMdd), DATE_FORMATTER_YYYYMMDD);
            return DateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.ENGLISH).format(valueDate);
        } catch (Exception e) {
            log.warn("failed to convert {} into ddMMMyyyy format", valueDate_yyyyMMdd, e);
            return valueDate_yyyyMMdd;
        }
    }

例如,当我输入无效日期时,我希望该方法能够返回我输入的值,而不是将其更改为有效日期。

例如,在上面的方法中,如果我将

20240230
传递给它,结果是
28-Feb-2024
。 “28”是出乎意料的。预期是什么?因为 20240230 是一个无效的日期,所以在解析它的时候,应该抛出异常,然后执行 catch 子句,所以最终返回输入。

我浏览了这个文档Java 8 LocalDateTime正在解析无效的日期时间并改进我的代码:

    String valueDate(String valueDate_yyyyMMdd) {
        try {
            DateTimeFormatter DATE_FORMATTER_YYYYMMDD = DateTimeFormatter
                    .ofPattern("yyyyMMdd", Locale.US)
                    .withResolverStyle(ResolverStyle.STRICT);
            final LocalDate valueDate = LocalDate.parse(StringUtils.trim(valueDate_yyyyMMdd), DATE_FORMATTER_YYYYMMDD);
            return  DateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.ENGLISH).format(valueDate);
        } catch (Exception e) {
            log.warn("failed to convert {} into ddMMMyyyy format", valueDate_yyyyMMdd, e);
            return valueDate_yyyyMMdd;
        }
    }

但这一次,它无法处理

20230101
。抛出一个异常:

java.time.format.DateTimeParseException: Text '20230101' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {YearOfEra=2023, DayOfMonth=1, MonthOfYear=1},ISO of type java.time.format.Parsed
java
1个回答
1
投票

如果我将 20240230 传递给它,结果是 28-Feb-2024。

这是一个功能,而不是一个错误。如文档中所述,默认情况下

LocalDate.parse
使用
ResolverStyle
枚举对象
SMART
。引用 JavaDoc 的
SMART

将最后一个有效日期之后的任何值转换为最后一个有效日期。

DateTimeFormatter.ofPattern("yyyyMMdd")

对于该模式,请使用预定义常量

BASIC_ISO_DATE
。 “基本”一词是来自ISO 8601标准的技术术语。

应该抛出异常,然后执行catch子句

对于该行为,请将

ResolverStyle
更改为
STRICT

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