Java解析日期字符串遇ParseException,求转换为指定格式的解决方案
解决日期解析与格式化的问题
嘿,我来帮你搞定这个日期解析的坑!你遇到的ParseException其实是个很常见的小问题——你的解析格式和输入的日期字符串完全不匹配,具体来说:
- 你拿到的服务器字符串是
2018-05-23T06:39:37+0000,这里面压根没有毫秒部分(就是.SSS对应的那串数字) - 但你写的解析格式是
yyyy-MM-dd'T'HH:mm:ss.SSSZ,强制要求必须有毫秒,这不就直接解析失败了嘛!
另外你说直接用dd/MM/yyyy hh:mm去解析原字符串也报错,这很正常——解析格式必须和输入字符串的结构严格对应,你总不能让程序把2018-05-23T...直接当成dd/MM/yyyy来认对吧?得先把原字符串正确解析成日期对象,再转成你想要的格式。
方案一:用SimpleDateFormat(兼容旧Java版本)
分两步走,先解析再格式化,思路很清晰:
第一步:用匹配输入的格式解析
原字符串对应的正确解析格式是yyyy-MM-dd'T'HH:mm:ssZ(去掉了多余的.SSS)
完整代码示例
String createdDate = comment.getCreatedDateTime(); // 定义解析用的格式(和输入字符串严格匹配) SimpleDateFormat parseFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US); // 定义输出用的目标格式 SimpleDateFormat outputFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm", Locale.US); try { Date parsedDate = parseFormat.parse(createdDate); // 把解析后的Date转成你想要的格式字符串 createdDate = outputFormat.format(parsedDate); } catch (ParseException ex) { ex.printStackTrace(); // 这里可以加个友好的错误提示,别让用户看到原错误字符串 createdDate = "日期解析失败"; } mCommentDate.setText(createdDate);
方案二:用Java 8+的新日期API(强烈推荐!)
SimpleDateFormat有个大坑——它是线程不安全的,在多线程环境下容易出问题。Java 8及以后推出的java.time包(JSR-310)解决了这个问题,用法也更直观:
String createdDate = comment.getCreatedDateTime(); // 输入格式 DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US); // 输出格式 DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm", Locale.US); try { // 解析成带时区的日期时间对象 ZonedDateTime zonedDateTime = ZonedDateTime.parse(createdDate, parseFormatter); // 转成目标格式的字符串 createdDate = zonedDateTime.format(outputFormatter); } catch (DateTimeParseException ex) { ex.printStackTrace(); createdDate = "日期解析失败"; } mCommentDate.setText(createdDate);
小提醒
- 注意
HH和hh的区别:HH是24小时制,hh是12小时制。比如你的时间是06:39,用hh会显示成上午06:39,如果需要区分上午下午,可以在输出格式里加aa,比如dd/MM/yyyy hh:mm aa - 如果以后遇到的时区格式是
+00:00(带冒号),那解析格式里的Z要换成XXX哦
内容的提问来源于stack exchange,提问作者Óscar
相关产品推荐
相关产品推荐

