使用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
相关产品推荐
相关产品推荐

