You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:27:03