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

Android中指定GMT日期格式的匹配模式及替代Date.parse的转换方法

Android中替代Date.parse()的方案及RFC 1123日期解析

针对你提到的日期字符串Mon, 14 May 2018 11:47:11 GMT,我来一步步解决你的问题:

1. 日期格式匹配模式

这个字符串是标准的RFC 1123日期格式,对应的解析模式为:

EEE, dd MMM yyyy HH:mm:ss zzz
  • EEE:缩写的星期名称(比如Mon)
  • dd:两位数字的日期(比如14)
  • MMM:缩写的月份名称(比如May)
  • yyyy:四位数字的年份(比如2018)
  • HH:mm:ss:24小时制的时分秒
  • zzz:时区标识(比如GMT)

2. 替代Date.parse()的方法

因为java.util.Date.parse(String)已被弃用,官方推荐两种更可靠的替代方案,根据你的Android版本选择:

方案一:SimpleDateFormat(兼容所有Android版本)

这是传统的兼容方案,适用于所有API等级。需要注意必须指定英文Locale,避免系统语言差异导致解析失败:

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

public class DateParser {
    public static Date parseRfc1123Date(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
        try {
            return sdf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return null; // 或者抛出自定义异常处理
        }
    }
}

方案二:Java 8+ java.time API(推荐,API 26+)

从Android 8.0(API 26)开始,官方支持Java 8的现代时间API,它线程安全、API设计更清晰。如果需要兼容低版本,可以使用ThreeTenABP库(Android版的JSR-310实现):

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

public class ModernDateParser {
    public static Date parseRfc1123Date(String dateStr) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateStr, formatter);
        // 转换为Date实例(如果需要的话)
        return Date.from(zonedDateTime.toInstant());
    }
}

关键注意事项

  • 必须指定Locale.US或Locale.ENGLISH:因为日期中的星期、月份是英文缩写,如果系统默认是其他语言,会导致解析失败。
  • 优先使用java.time API:它比SimpleDateFormat更健壮,避免了线程安全问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:32:16