You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用yyyyMMddHHmmssSSS格式解析LocalDateTime为何抛出DateTimeParseException

问题原因

  • 核心问题是DateTimeFormatter的ofPattern方法处理无分隔符的相邻数值字段时的默认匹配规则导致的:
    • 模式字符串中的ss代表秒字段,默认是最小长度为2位的可变长度匹配,而非强制固定2位;SSS代表毫秒字段,默认最小长度为3位。
    • 第二段代码没有任何分隔符拆分秒和毫秒字段,解析连续数字串20211211134321221时,解析器无法自动区分秒和毫秒的边界,会将秒字段后的连续数字全部匹配给秒字段,导致解析出的秒值远大于合法范围(0~59),最终抛出DateTimeParseException。
  • 第一段代码可以正常执行的原因是小数点作为明确的分隔符,清晰划分了秒和毫秒的边界,解析器可以准确识别两个字段的范围,不会出现匹配歧义。

修复方案

如果需要解析无分隔符的时间串,可以使用DateTimeFormatterBuilder显式指定每个字段的固定宽度,避免匹配歧义:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.YEAR, 4)
        .appendValue(ChronoField.MONTH_OF_YEAR, 2)
        .appendValue(ChronoField.DAY_OF_MONTH, 2)
        .appendValue(ChronoField.HOUR_OF_DAY, 2)
        .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
        .appendValue(ChronoField.SECOND_OF_MINUTE, 2)
        .appendValue(ChronoField.MILLI_OF_SECOND, 3)
        .toFormatter();
LocalDateTime dt = LocalDateTime.parse("20211211134321221", formatter);

内容的提问来源于stack exchange,提问作者Linda Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:24:03