Java16 DateTimeFormatter带单引号Z解析LocalDateTime失败问题
解析失败的核心原因
你在模式中定义的'Z'字面量,要求待解析的字符串末尾必须包含大写字母Z才能匹配成功,而你传入的待解析字符串2017-01-17 09:28:45末尾没有该字符,因此触发解析异常。
补充说明
- 你对单引号作用的认知本身没有问题:
DateTimeFormatter模式中,单引号包裹的内容确实会被识别为固定字面量,但「字面量」的规则是要求输入对应位置必须完全匹配该内容,而非自动忽略这个规则要求。 - 你用不带
'Z'的模式可以解析成功,就是因为该模式的规则和你输入的字符串结构完全匹配,没有多余的字符要求。
验证示例
如果你调整待解析字符串为末尾带Z的格式,原模式就可以正常运行:
// 输入字符串末尾带Z,和模式规则匹配,可正常解析 final LocalDateTime dateTime = LocalDateTime.parse("2017-01-17 09:28:45Z", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss'Z'"));
场景拓展建议
如果你的业务中拿到的时间字符串有时会带代表UTC时区的Z后缀,不要硬编码字面量匹配,建议用官方内置的时区格式符处理:
// 自动识别Z为UTC偏移,灵活适配带/不带偏移的时间字符串 final LocalDateTime dateTime = ZonedDateTime.parse("2017-01-17 09:28:45Z", DateTimeFormatter.ISO_ZONED_DATE_TIME) .toLocalDateTime();
内容的提问来源于stack exchange,提问作者Umer Asim
相关产品推荐
相关产品推荐

