Java中如何将带'T'分隔符的字符串日期转为java.sql.Timestamp
Java字符串转java.sql.Timestamp 适配ISO 8601带T/Z格式解决方案
报错原因
你的原有代码无法解析带T、带Z的日期字符串,核心有两个问题:
- 原有模式串
yyyy-MM-dd hh:mm:ss.SSS用空格匹配日期和时间的分隔位,无法匹配ISO 8601标准格式中作为分隔符的T字符 - 模式串中的
hh是12小时制标识,针对24小时制的时间值会出现解析错误,需要替换为24小时制标识HH
方案1:继续使用SimpleDateFormat适配
适配不带Z的2021-08-04T00:00:00.000格式
把模式串中的空格替换为转义后的'T'即可,修改后模式串为yyyy-MM-dd'T'HH:mm:ss.SSS
适配带Z后缀的2021-08-04T00:00:00.000Z格式
Z是UTC时区的官方标识,使用模式字符X即可匹配该后缀,同时会自动处理时区转换,模式串为yyyy-MM-dd'T'HH:mm:ss.SSSX
修改后可兼容三种格式的示例代码:
import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateTest { public static void main(String[] args) throws ParseException { // 带Z的UTC格式字符串 String dateWithZ = "2021-08-04T00:00:00.000Z"; // 带T不带Z的格式字符串 String dateWithT = "2021-08-04T00:00:00.000"; // 普通空格分隔的格式字符串 String normalDate = "2021-01-07 02:02:16.172"; // 适配带T不带Z的格式 SimpleDateFormat tFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); Date parsedTDate = tFormat.parse(dateWithT); Timestamp tTimestamp = new Timestamp(parsedTDate.getTime()); System.out.println("带T格式转换结果:" + tTimestamp); // 适配带Z的UTC格式 SimpleDateFormat zFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); Date parsedZDate = zFormat.parse(dateWithZ); Timestamp zTimestamp = new Timestamp(parsedZDate.getTime()); System.out.println("带Z格式转换结果:" + zTimestamp); // 原普通格式适配 SimpleDateFormat normalFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date parsedNormalDate = normalFormat.parse(normalDate); Timestamp normalTimestamp = new Timestamp(parsedNormalDate.getTime()); System.out.println("普通格式转换结果:" + normalTimestamp); } }
方案2:Java 8+ 更优方案(推荐)
Java 8之后推出的java.time包原生支持ISO 8601格式,不需要手动编写模式串,且天生线程安全,代码更简洁:
import java.sql.Timestamp; import java.time.Instant; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class DateTestJava8 { public static void main(String[] args) { // 带Z的UTC格式字符串直接用Instant解析 String dateWithZ = "2021-08-04T00:00:00.000Z"; Instant instant = Instant.parse(dateWithZ); Timestamp zTimestamp = Timestamp.from(instant); System.out.println("带Z格式转换结果:" + zTimestamp); // 带T不带Z的格式用LocalDateTime解析 String dateWithT = "2021-08-04T00:00:00.000"; LocalDateTime localDateTime = LocalDateTime.parse(dateWithT, DateTimeFormatter.ISO_LOCAL_DATE_TIME); Timestamp tTimestamp = Timestamp.valueOf(localDateTime); System.out.println("带T格式转换结果:" + tTimestamp); } }
内容的提问来源于stack exchange,提问作者Masoom Raza
相关产品推荐
相关产品推荐

