使用DateTimeFormatter解析GMT日期时触发DateTimeParseException异常
解决DateTimeParseException异常:解析GMT日期到Instant
你的代码抛出异常主要有几个问题,咱们一步步来修正:
问题分析
- 模式字符串错误:你写的
"EEE' dd LLL yyyy HH:mm:ss '''"有两处问题:- 错误地用单引号包裹了空格和逗号的位置(原日期里是
Wed, 21,你的模式里没有匹配逗号,反而加了不必要的单引号) - 末尾的三个单引号根本没匹配原日期的
GMT时区标识,导致解析时找不到对应部分
- 错误地用单引号包裹了空格和逗号的位置(原日期里是
- 缺少英文Locale:默认情况下
DateTimeFormatter会使用系统Locale,如果你的系统不是英文环境,EEE(星期缩写)和LLL(月份缩写)无法识别Wed、Oct这类英文标识 - 时区信息未正确解析:原日期带GMT时区,但你的模式没处理,导致解析后的
TemporalAccessor没有时区数据,Instant.from()无法生成有效实例
修正后的代码
方式一:自定义正确的格式化器
String date = "Wed, 21 Oct 2016 07:28:00 GMT"; // 匹配原日期结构,指定英文Locale确保解析英文缩写 DateTimeFormatter gmtFormat = DateTimeFormatter.ofPattern("EEE, dd LLL yyyy HH:mm:ss z", Locale.ENGLISH); TemporalAccessor parsed = gmtFormat.parse(date); Instant a = Instant.from(parsed); System.out.println(a); // 输出:2016-10-21T07:28:00Z
方式二:使用预定义的格式化器(更推荐)
你这个日期格式是标准的RFC 1123日期格式,Java已经提供了预定义的RFC_1123_DATE_TIME格式化器,不用自己写模式,更不容易出错:
String date = "Wed, 21 Oct 2016 07:28:00 GMT"; Instant a = DateTimeFormatter.RFC_1123_DATE_TIME .withLocale(Locale.ENGLISH) .parse(date, Instant::from); System.out.println(a); // 输出:2016-10-21T07:28:00Z
关键修正点说明
- 模式字符串:
"EEE, dd LLL yyyy HH:mm:ss z"里的z用来匹配时区标识(比如GMT),逗号直接保留以匹配原日期的Wed,结构 - Locale指定:
Locale.ENGLISH强制使用英文环境解析星期和月份缩写,避免系统Locale差异导致的解析失败 - 预定义格式化器:
RFC_1123_DATE_TIME完全符合你的输入格式,使用它可以避免手动编写模式时的错误
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

