You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动