如果删除了空间,java DateTimeFormatter解析带有可选时间部分的字符串将失败
在my other question on how to parse date-only strings as LocalDateTime之后,在尝试使用模式yyyyMMdd[HHmmss]解析字符串20120301122133时,我得到一个错误。奇怪的是,使用模式yyyyMMdd[HHmmss]解析20120301 122133非常有效
所以这个代码很好用
LocalDateTime.parse(
"19940513 230000",
new DateTimeFormatterBuilder()
.appendPattern("yyyyMMdd[ HHmmss]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter()
)
这一次失败了
LocalDateTime.parse(
"19940513230000",
new DateTimeFormatterBuilder()
.appendPattern("yyyyMMdd[HHmmss]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter()
)
我应该如何解析格式为yyyyMMdd[HHmmss]的字符串,即使用java 8 time API解析格式为yyyyMMddHHmmss的字符串,该格式带有可选的时间部分
解析模式是一个可配置的选项,因此只有在运行时才知道。所以我不能用硬编码的DateTimeFormatterBuilder调用替换字符串模式
# 1 楼答案
之所以会出现这种情况,是因为年份没有固定的值,通常限制在19位
如果创建以下格式化程序(不需要分钟和秒)并使用
toString()
方法:您可以看到以下内容:
在这里你可以看到
YearOfEra
的最小宽度为4,最大宽度为19您可以使用Meno或Ole的其中一个答案
但是,如果需要接收格式和日期作为参数,并且希望能够以更简单的方式指定日期格式(例如
yyyyMMdd[HHmmSS]
而不是[...][...]
),则可以预处理其中一个to值(日期的格式)您可以创建格式化程序,因此每个
yyyy
仅被解释为4位数的年份自定义格式生成器可以是(可以改进的):
这个格式化程序用字符串
"yyyy"
拆分格式,然后每个非"yyyy"
被添加为一个模式(使用appendPattern(..)
),而"yyyy"
被添加为一个固定4位的YEAR_OF_ERA
类型的值(使用appendValue(..)
)最后,您可以将格式化程序用于多种格式:
# 2 楼答案
这张照片是:
相反,如果我试图解析一个只包含日期的字符串,
"19940513"
,我会得到它与
yyyy
而不是uuuu
一起工作。假设你所有的年龄都在这个时代(第一年或更晚),你用哪一年没有任何区别。通常uuuu
也会接受负年份,0表示公元前1年,-1表示公元前2年,以此类推