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
如果我将 20240230 传递给它,结果是 28-Feb-2024。
这是一个功能,而不是一个错误。如文档中所述,默认情况下
LocalDate.parse
使用ResolverStyle
枚举对象SMART
。引用 JavaDoc 的 SMART
:
将最后一个有效日期之后的任何值转换为最后一个有效日期。
DateTimeFormatter.ofPattern("yyyyMMdd")
BASIC_ISO_DATE
。 “基本”一词是来自ISO 8601标准的技术术语。
应该抛出异常,然后执行catch子句
对于该行为,请将
ResolverStyle
更改为 STRICT
。