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

使用SimpleDateFormat解析日期时间遇格式匹配问题求助

解决GMT偏移日期的SimpleDateFormat解析问题

嘿,我来帮你搞定这个日期解析的难题!你遇到的问题核心是输入日期里的GMT-8这种带一位数字的时区偏移格式,和SimpleDateFormat的模式匹配规则没对上,加上可能没注意Locale的问题,才导致解析失败。

正确的模式及代码示例

首先,针对你的输入Thu May 31 01:43:45 GMT-8 2018,正确的SimpleDateFormat模式是:

"EEE MMM dd HH:mm:ss 'GMT'X yyyy"

但一定要搭配Locale.US使用,因为日期里的星期、月份是英文缩写,系统默认Locale如果不是英文的话会解析失败。完整代码如下:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateParseTest {
    public static void main(String[] args) throws Exception {
        String dateStr = "Thu May 31 01:43:45 GMT-8 2018";
        // 必须指定Locale.US,否则非英文环境下会解析失败
        SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss 'GMT'X yyyy", Locale.US);
        Date date = sdf.parse(dateStr);
        System.out.println("解析结果:" + date);
    }
}

如果你的项目用的是Java 8及以上,更推荐使用线程安全的DateTimeFormatter,模式类似,代码更简洁:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class DateTimeParseTest {
    public static void main(String[] args) {
        String dateStr = "Thu May 31 01:43:45 GMT-8 2018";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss 'GMT'X uuuu", Locale.US);
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateStr, formatter);
        System.out.println("解析结果:" + zonedDateTime);
    }
}

为什么你之前的模式会失败?

我来帮你拆解一下之前尝试的问题:

  • 模式"EEE MMM dd HH:mm:ss zX yyyy":z是用来匹配时区名称(比如GMT、EST)的,但你输入里的GMT-8会被z尝试当成一个完整的时区名,而SimpleDateFormat默认不识别这种带一位数字的简写偏移,所以匹配失败。
  • 模式"EEE MMM dd HH:mm:ss 'GMT'X yyyy":你之前可能没指定Locale.US,如果系统默认是中文Locale,May、Thu这些英文缩写会被判定为无效的日期字段,直接抛出异常。
  • 重复的第一个模式问题和上述第一条一致。

关于两位数字偏移的适配

这个模式也能完美适配GMT-10这种两位数字的偏移,因为X模式在Java 7+中支持匹配一位或两位的小时偏移(比如-8、+10),完全覆盖你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:23:15