使用Apache DateUtils.parseDate解析带时区日期字符串抛出ParseException如何解决
问题解决方案
- 你之前使用的
TZD不属于Java SimpleDateFormat的合法格式占位符,用单引号包裹的内容会被识别为固定字符串,无法匹配动态的时区偏移量,因此解析失败。 - 你测试的格式中用到的
YYYY是周年纪年规则、hh是12小时制规则,均不符合你的输入串对应的日期属性,也会导致解析错误。
你的输入串"2021-09-11T12:02:50-06:00Z"属于带时区偏移的ISO 8601格式,其中-06:00是西6区的时区偏移,末尾的Z为固定后缀。
如果你的Java版本 >= 7(支持XXX格式符匹配带冒号的时区偏移),正确的配置如下:
public static Date toDate (String dateString) throws ParseException { // 适配带-06:00偏移且末尾带Z的格式 String DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssXXX'Z'"; return DateUtils.parseDate(dateString, DATETIME_FORMAT); }
如果你的输入串末尾的Z是笔误,实际为"2021-09-11T12:02:50-06:00"格式,直接去掉格式串中的'Z'即可:
public static Date toDate (String dateString) throws ParseException { String DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssXXX"; return DateUtils.parseDate(dateString, DATETIME_FORMAT); }
补充注意事项
- 如果使用Java 7以下版本,不支持
XXX格式符,可以先对输入串做预处理,移除偏移量中的冒号后,使用yyyy-MM-dd'T'HH:mm:ssZ格式解析即可。 - 如果你使用的Apache Commons Lang 3版本 >= 3.7,也可以直接使用内置的ISO格式工具,无需自定义格式串。
内容的提问来源于stack exchange,提问作者RAHUL VISHWAKARMA
相关产品推荐
相关产品推荐

