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.timeAPI:它比SimpleDateFormat更健壮,避免了线程安全问题。
内容的提问来源于stack exchange,提问作者Reza Hamzehei
相关产品推荐
相关产品推荐

