Java:Unparseable date错误求助——日期格式解析问题
解决SimpleDateFormat解析带时区偏移日期的异常问题
这个报错的原因很明确:你写的格式字符串里把'Z'用单引号包裹了,这意味着它会被当作固定的字符字面量来匹配——也就是说,你的代码只会认结尾是Z的日期字符串,但你的输入是+03:00(时区偏移量),两者不匹配,自然就抛出解析异常了。
下面给你两种解决方案,按需选择:
方案1:修复SimpleDateFormat的格式规则
把格式字符串里的'Z'替换成时区偏移的专用格式符XXX,它专门用来匹配+03:00这种带冒号的时区偏移格式。修改后的代码如下:
String targetDate = "2017-04-09T11:15:39.200+03:00"; SimpleDateFormat correctSdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); Date parsedDate = correctSdf.parse(targetDate);
顺便提一下格式符的区别:
XXX→ 匹配带冒号的时区偏移(如+03:00、-05:30)XX→ 匹配不带冒号的时区偏移(如+0300、-0530)X→ 匹配Z(UTC时区)或不带冒号的小时级偏移(如+03)
方案2:推荐使用Java 8+的新日期时间API(更优选择)
SimpleDateFormat是线程不安全的,在多线程场景下很容易出问题。Java 8及以后版本引入的java.time包(JSR-310标准)不仅线程安全,API设计也更清晰,而且可以直接解析这种标准的ISO 8601格式日期,不需要手动写格式字符串:
String targetDate = "2017-04-09T11:15:39.200+03:00"; // 直接解析为带时区偏移的日期时间对象 OffsetDateTime offsetDateTime = OffsetDateTime.parse(targetDate); // 如果需要兼容旧代码转换成java.util.Date: Date parsedDate = Date.from(offsetDateTime.toInstant());
如果你的项目还在使用Java 7或更早版本,可以引入Joda-Time库来实现类似的便捷解析,它是java.time的前身,用法大同小异。
内容的提问来源于stack exchange,提问作者john paul




