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
相关产品推荐
相关产品推荐

