Java中如何将ISO 8601格式字符串解析为Date对象?
错误原因
- 输入的ISO 8601格式字符串使用
T作为日期和时间的分隔符,你定义的SimpleDateFormat解析模式串用了空格占位,格式完全不匹配,因此触发解析异常。 - 模式符使用错误:大写
M对应的是月份,小写m才对应分钟,原写法HH:MM:ss会把分钟位的数值识别为月份,即使解决了T的匹配问题,最终也会得到错误的时间结果。
修复方案
方案1:修正SimpleDateFormat写法(适配Java 8之前的版本)
修改解析用的模式串,转义T字符并将分钟的模式符改为小写m即可:
import java.text.SimpleDateFormat; import java.util.Date; public class Test { public static void main(String[] args) throws Exception { String date = "2021-05-14T09:26:20"; // T用单引号转义,分钟使用小写m SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date newDate = parser.parse(date); System.out.println(format.format(newDate)); } }
方案2:使用Java 8+ 新时间API(更推荐)
java.time包是Java 8之后推出的官方时间处理API,原生支持ISO 8601格式,无需手动拼接复杂的模式串,且天生线程安全,不存在SimpleDateFormat的多线程并发问题:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { String date = "2021-05-14T09:26:20"; // 原生支持ISO 8601格式,直接解析即可 LocalDateTime dateTime = LocalDateTime.parse(date); // 按需求格式化输出 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); System.out.println(dateTime.format(formatter)); // 如果业务确实需要转为java.util.Date对象,可使用以下方式转换 // Date newDate = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()); } }
内容的提问来源于stack exchange,提问作者user12755870
相关产品推荐
相关产品推荐

