如果删除空格,DateTimeFormatter 解析具有可选时间部分的字符串将失败

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 模式。

Ole*_*.V. 3

    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

1994-05-13T23:00

\n
\n\n

相反,如果我尝试解析仅包含日期的字符串,"19940513"我得到

\n\n
\n

1994-05-13T00:00

\n
\n\n

它适用yyyy于代替uuuu太。假设你所有的年份都在这个时代(第一年或之后),那么\xe2\x80\x99对你使用哪个时代没有任何影响。通常uuuu也接受负年份,0 表示公元前 1 年,-1 表示公元前 2 年,依此类推。

\n