Kam*_*man 5 java java-8 java-time
在我的另一个关于如何将仅日期字符串解析为 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()
)
Run Code Online (Sandbox Code Playgroud)
而这个失败了
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()
)
Run Code Online (Sandbox Code Playgroud)
我应该如何使用java 8时间API解析格式为yyyyMMdd[HHmmss]的字符串,即格式为yyyyMMddHHmmss且带有可选时间部分的字符串?
解析模式是一个可配置选项,因此仅在运行时才知道。因此,我无法用硬编码的 DateTimeFormatterBuilder 调用替换 String 模式。
System.out.println(LocalDateTime.parse(\n "19940513230000",\n new DateTimeFormatterBuilder()\n .appendPattern("[uuuuMMddHHmmss][uuuuMMdd]")\n .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) \n .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) \n .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)\n .toFormatter()\n ));\n
Run Code Online (Sandbox Code Playgroud)\n\n这打印:
\n\n\n\n\n1994-05-13T23:00
\n
相反,如果我尝试解析仅包含日期的字符串,"19940513"
我得到
\n\n\n1994-05-13T00:00
\n
它适用yyyy
于代替uuuu
太。假设你所有的年份都在这个时代(第一年或之后),那么\xe2\x80\x99对你使用哪个时代没有任何影响。通常uuuu
也接受负年份,0 表示公元前 1 年,-1 表示公元前 2 年,依此类推。