如何解决java.text.ParseException:无法解析带时区的日期字符串?
解决Java解析特定日期字符串的ParseException问题
你遇到的解析异常核心原因是日期格式模式和目标字符串的结构不匹配,再加上没指定正确的Locale,咱们一步步来修正:
问题分析
你的目标日期字符串是:Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)
而你用的模式"E MMM dd hh:mm:ss Z yyyy"存在几个关键问题:
- 年份
yyyy的位置错误:原字符串中年份在日期(14)之后,但你的模式把年份放在了最后 - 没有匹配字符串中的固定文本:比如
GMT前缀和(India Standard Time)时区名称部分 hh是12小时制格式,这里时间是00,用HH(24小时制)更准确
解决方案一:修正SimpleDateFormat(适合Java 7及以下)
调整格式模式,把固定文本用单引号包裹,同时修正年份位置和时区匹配,还要指定英文Locale(避免系统默认非英文Locale导致解析失败):
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class DateParseExample { public static void main(String[] args) { String dateStr = "Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)"; // 修正后的格式模式:匹配所有部分 SimpleDateFormat formatter = new SimpleDateFormat("E MMM dd yyyy HH:mm:ss 'GMT'Z '('zzz')'", Locale.ENGLISH); try { Date date = formatter.parse(dateStr); System.out.println("解析后的Date对象:" + date); } catch (ParseException e) { e.printStackTrace(); } } }
模式说明:
E:匹配星期缩写(如Sat)MMM:匹配月份缩写(如Sep)dd:匹配日期(如14)yyyy:匹配年份(如2019)HH:mm:ss:24小时制的时分秒'GMT':匹配字符串中固定的GMT文本Z:匹配时区偏移(如+0530)'('zzz')':匹配带括号的时区名称(如(India Standard Time))
解决方案二:使用Java 8+的新日期API(推荐)
SimpleDateFormat是线程不安全的,Java 8及以上更推荐使用java.time包下的API,比如ZonedDateTime和DateTimeFormatter:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; public class ModernDateParseExample { public static void main(String[] args) { String dateStr = "Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "EEE MMM dd yyyy HH:mm:ss 'GMT'XXX '('zzz')'", Locale.ENGLISH ); ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateStr, formatter); System.out.println("解析后的ZonedDateTime:" + zonedDateTime); // 如果需要转为Date对象(兼容旧代码) Date date = Date.from(zonedDateTime.toInstant()); System.out.println("转为Date对象:" + date); } }
这个方案更安全,功能也更强大,推荐在新项目中使用。
内容的提问来源于stack exchange,提问作者Pavitra SM
相关产品推荐
相关产品推荐

