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

在Java项目中将字符串"2022-11-28T20:02:28.215Z"转为带时区Date报错求助

问题解决:字符串转带时区的Date类型

问题根源

你的代码抛出异常主要有两个原因:

  • 格式字符串错误:原格式yyyy-MM-dd'T'HH:mm:sssZ中,sss不是毫秒的正确写法(SimpleDateFormat中毫秒用SSS);另外输入字符串末尾的Z代表UTC时区,而Z格式符匹配的是+0000这类偏移格式,无法直接匹配Z。
  • SimpleDateFormat本身线程不安全,属于Java旧日期API,不推荐在新代码中使用。

解决方案

方案1:修复旧API(SimpleDateFormat)写法

调整格式字符串并指定时区,解决匹配问题:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class DateParser {
    // 修正格式:SSS表示毫秒,X支持匹配UTC的Z格式
    private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSX";

    public static Date parseString(String date) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
        // 指定UTC时区,避免本地时区干扰解析结果
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        return sdf.parse(date);
    }
}

方案2:推荐使用Java 8+新日期API(更安全可靠)

Java 8引入的java.time包线程安全、设计更合理,是官方推荐的日期处理方案。如果最终需要Date对象,可通过带时区的日期对象转换:

import java.util.Date;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class DateParser {
    // 使用标准ISO_INSTANT格式,直接匹配输入字符串格式
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_INSTANT;

    public static Date parseString(String date) {
        // 解析为带UTC时区的ZonedDateTime
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(date, FORMATTER);
        // 转换为Date对象
        return Date.from(zonedDateTime.toInstant());
    }
}

注意:Date对象本质是一个时间戳(从1970-01-01 UTC开始的毫秒数),本身不携带时区信息。如果需要保留时区上下文,建议直接使用ZonedDateTime或OffsetDateTime这类java.time下的类型,而非Date。

内容的提问来源于stack exchange,提问作者Yarik83Men

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:42:15