使用 Java SimpleDateFormatClass 时的 ParseException

问题描述

在 Java 中使用 SimpleDateFormat 类时出现以下异常。

java.text.ParseException: Unparseable date: "2021-03-21T06:02:30.279Z"

我的代码如下:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

我一直在关注位于 https://docs.oracle.com/javase/10/docs/api/java/text/SimpleDateFormat.html 的示例,所以我不确定为什么这不起作用。有人可以帮忙吗?

解决方法

使用模式,yyyy-MM-dd'T'HH:mm:ss.SSSX

演示:

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Main {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
        System.out.println(simpleDateFormat.parseObject("2021-03-21T06:02:30.279Z"));
    }
}

输出:

Sun Mar 21 06:02:30 GMT 2021

请注意,java.util 日期时间 API 及其格式 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API*

使用现代日期时间 API:

import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        System.out.println(Instant.parse("2021-03-21T06:02:30.279Z"));
    }
}

输出:

2021-03-21T06:02:30.279Z

请注意,由于您的日期时间字符串已经符合 ISO 8601,因此对于基于 ISO 8601 的 java.time API,您不需要格式化程序/解析器.

Trail: Date Time 了解有关现代日期时间 API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project