如何使用 jsr310 DateTimeFormatter 解析不区分大小写的字符串?
Posted
技术标签:
【中文标题】如何使用 jsr310 DateTimeFormatter 解析不区分大小写的字符串?【英文标题】:How to parse case-insensitive strings with jsr310 DateTimeFormatter? 【发布时间】:2012-06-03 14:20:29 【问题描述】:jsr-310 有一个方便的类DateTimeFormatters
,它允许你构造一个DateTimeFormatter
。我特别喜欢pattern(String)
方法——见javadoc
但是,我遇到了一个区分大小写的问题——例如
DateTimeFormatters.pattern("dd-MMM-yyyy");
与“01-JAN-2012”匹配,但不与“01-JAN-2012”或“01-jan-2012”匹配。
一种方法是分解字符串并解析组件,或者另一种方法是使用正则表达式将不区分大小写的字符串替换为区分大小写的字符串。
但感觉应该有更简单的方法......
【问题讨论】:
【参考方案1】:还有...根据User Guide(离线,请参阅JavaDoc),你应该使用DateTimeFormatterBuilder
来构建一个复杂的DateTimeFormatter
例如
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
builder.parseCaseInsensitive();
builder.appendPattern("dd-MMM-yyyy");
DateTimeFormatter dateFormat = builder.toFormatter();
【讨论】:
稍微整洁的第三行:builder.appendPattern("dd-MMM-yyyy"); 稍微简洁:大多数时候,构建器提供方法返回构建器,因此您可以使用方法链接:new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern...
。
【参考方案2】:
这种方法对于初始化静态变量很有用:
DateTimeFormatter myFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("dd-MMM-yyyy")
.toFormatter(Locale.ENGLISH);
【讨论】:
似乎复制了几年前的accepted Answer【参考方案3】:只是一个额外的说明,顺序很重要。
这是不区分大小写的:
DateTimeFormatter format = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.parseLenient()
.appendPattern("HH:mm EEEE")
.toFormatter();
这不是:
DateTimeFormatter format = new DateTimeFormatterBuilder()
.appendPattern("HH:mm EEEE")
.parseCaseInsensitive()
.parseLenient()
.toFormatter();
【讨论】:
以上是关于如何使用 jsr310 DateTimeFormatter 解析不区分大小写的字符串?的主要内容,如果未能解决你的问题,请参考以下文章
杰克逊 jsr310 中缺少 ZonedDateTimeDeserializer
使用 Jackson JSR310 模块反序列化 LocalDateTime
在春季使用 JSR310 java.time 时将日期、即时序列化为 ISO 8601