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

在Java及Android Studio中如何将指定格式字符串转换为Date对象

Java解析"2021-05-19T20:43:29+00:00"格式时间为Date对象的解决方案

失败原因说明

你之前使用的两种格式串均无法匹配的核心原因有两个:

  • 待解析的时间字符串不包含毫秒字段,但你写的格式串中加入了.SSS用于匹配毫秒,导致格式不匹配
  • 时区后缀+00:00是带冒号的偏移量格式,传统Z格式符仅能匹配不带冒号的时区偏移(如+0000),需要用XXX匹配带冒号的偏移量

方案1:Java 8+ 官方推荐方案(优先使用)

Java 8开始引入的java.time包(JSR310)原生支持ISO8601标准格式的时间解析,无需手动编写格式串,且API线程安全,避免了传统SimpleDateFormat的线程安全问题。
如果需要转为传统java.util.Date对象,代码示例如下:

import java.time.OffsetDateTime;
import java.util.Date;

public class TimeParseTest {
    public static void main(String[] args) {
        String timeStr = "2021-05-19T20:43:29+00:00";
        // 直接解析标准ISO偏移时间格式
        OffsetDateTime offsetDateTime = OffsetDateTime.parse(timeStr);
        // 转换为java.util.Date对象
        Date date = Date.from(offsetDateTime.toInstant());
    }
}

方案2:兼容低版本JDK的SimpleDateFormat方案

如果需要兼容Java 8以下的版本,可以使用SimpleDateFormat,使用修正后的格式串即可:

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

public class TimeParseTest {
    public static void main(String[] args) throws ParseException {
        String timeStr = "2021-05-19T20:43:29+00:00";
        // 去掉毫秒匹配字段,使用XXX匹配带冒号的时区偏移
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ROOT);
        Date date = sdf.parse(timeStr);
    }
}

注意事项

  • SimpleDateFormat为线程不安全类,多线程环境下不要作为全局静态变量直接复用,每次使用需单独实例化或用ThreadLocal封装
  • 如果后续待解析的时间字符串增加了毫秒字段(例如2021-05-19T20:43:29.123+00:00),再将.SSS加回格式串即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 12:36:03