如何将服务器返回的2018-01-18T13:52:49.107Z日期转为dd/MM/yyyy?
解决Java日期格式转换失败的问题
你的问题核心在于解析日期时用的格式字符串和输入的日期格式完全不匹配,导致ParseException被触发,最终返回了空字符串。
先看你的输入日期:2018-01-18T13:52:49.107Z,这是标准的ISO 8601 UTC格式——T是日期和时间的分隔符,Z代表UTC时区,毫秒部分是三位数字。而你用的解析格式yyyy-MMM-dd HH:mm:ss.S里,MMM是月份的英文缩写(比如Jan),既没处理T和Z这两个特殊字符,毫秒部分也只匹配一位数字,自然解析失败。
下面给你两种可行的修改方案:
方案1:修复SimpleDateFormat的写法
如果你坚持使用SimpleDateFormat(注意它是线程不安全的,多线程环境要谨慎),需要调整解析格式并设置正确的时区:
private String formatDate(String dateString) { try { // 匹配输入的ISO 8601格式,用单引号转义字面量T和Z SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); // 必须设置时区为UTC,因为输入的Z代表UTC时间,避免本地时区导致日期偏移 parser.setTimeZone(TimeZone.getTimeZone("UTC")); Date d = parser.parse(dateString); // 格式化目标格式 SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); return formatter.format(d); } catch (ParseException e) { // 建议在这里添加异常处理逻辑,比如打印日志 e.printStackTrace(); return ""; } }
方案2:使用Java 8+的java.time API(推荐)
从Java 8开始,官方推荐使用线程安全、API更清晰的java.time包处理日期时间,这是更稳妥的方案:
import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; import java.time.format.DateTimeFormatter; private String formatDate(String dateString) { try { // 直接解析ISO 8601格式的UTC时间戳 Instant instant = Instant.parse(dateString); // 转换为本地日期(这里用系统默认时区,若要使用UTC日期,替换为ZoneId.of("UTC")) LocalDate localDate = instant.atZone(ZoneId.systemDefault()).toLocalDate(); // 格式化为dd/MM/yyyy return DateTimeFormatter.ofPattern("dd/MM/yyyy").format(localDate); } catch (Exception e) { e.printStackTrace(); return ""; } }
这个方案不需要手动写复杂的格式字符串,Instant.parse()直接支持你输入的格式,而且线程安全,后续维护也更简单。
内容的提问来源于stack exchange,提问作者Lending Square
相关产品推荐
相关产品推荐

