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

DateTimeFormatter解析RSS时间报错,为何同pattern在SimpleDateFormat可用?

DateTimeFormatter自定义模式解析+0800时区失败的原因

我分别使用SimpleDateFormat和DateTimeFormatter解析同一时间字符串,代码如下:

val text = "Tue, 07 Mar 2023 15:32:23 +0800"
val pattern = "EEE, dd MMM yyyy HH:mm:ss zzz"
val date = SimpleDateFormat(pattern, Locale.ENGLISH).parse(text)
println(date)
val dateTime = LocalDateTime.parse(text, DateTimeFormatter.ofPattern(pattern, Locale.ENGLISH))
println(dateTime)

其中SimpleDateFormat可以正常解析,但DateTimeFormatter抛出解析错误:

java.time.format.DateTimeParseException:
Text 'Tue, 07 Mar 2023 15:32:23 +0800' could not be parsed at index 26

已知使用内置的DateTimeFormatter.RFC_1123_DATE_TIME可以成功解析,但想了解自定义模式存在什么问题导致解析失败。


问题根源:zzz符号的定义差异

SimpleDateFormat的zzz兼容性极强,既能识别GMT+08:00、PST这类时区名称,也能兼容+0800这种纯数字偏移格式。但DateTimeFormatter对zzz的规则非常严格——它仅匹配时区的文本名称,完全不支持+0800这种紧凑数字偏移格式,这就是解析报错的核心原因。

修正方案:替换为匹配偏移量的模式符号

针对输入的+0800格式(RFC 822风格的小时分钟偏移),只需把模式中的zzz替换为以下符号之一:

  • Z:专门匹配±HHmm格式的偏移(即你输入的+0800),是RFC 822标准定义的符号
  • XXXX:同样支持±HHmm格式,属于扩展的偏移符号

修正后的代码示例:

val text = "Tue, 07 Mar 2023 15:32:23 +0800"
val pattern = "EEE, dd MMM yyyy HH:mm:ss Z"
val dateTime = LocalDateTime.parse(text, DateTimeFormatter.ofPattern(pattern, Locale.ENGLISH))
println(dateTime)

另外补充:LocalDateTime本身不包含时区偏移信息,如果需要完整保留输入中的+0800偏移属性,建议使用OffsetDateTime来解析,更贴合数据本身的时区特征。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:42:37