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

使用DateTimeFormatter解析GMT日期时触发DateTimeParseException异常

解决DateTimeParseException异常:解析GMT日期到Instant

你的代码抛出异常主要有几个问题,咱们一步步来修正:

问题分析

  1. 模式字符串错误:你写的"EEE' dd LLL yyyy HH:mm:ss '''"有两处问题:
    • 错误地用单引号包裹了空格和逗号的位置(原日期里是Wed, 21,你的模式里没有匹配逗号,反而加了不必要的单引号)
    • 末尾的三个单引号根本没匹配原日期的GMT时区标识,导致解析时找不到对应部分
  2. 缺少英文Locale:默认情况下DateTimeFormatter会使用系统Locale,如果你的系统不是英文环境,EEE(星期缩写)和LLL(月份缩写)无法识别Wed、Oct这类英文标识
  3. 时区信息未正确解析:原日期带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:20:26