如何将 ISO 8601 解析为 Java 中的日期?

How to parse a ISO 8601 to Date in Java?

我正在尝试将 ISO 8601 日期解析为日期对象,但我做不到。

我正在尝试以下操作:

        String date = "2021-05-14T09:26:20";
        
        SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
        Date newDate = parser.parse(date);
        System.out.println(format.format(newDate));

但是我得到这个错误:

Exception in thread "main" java.text.ParseException: Unparseable date: "2021-05-14T09:26:20"
    at java.text.DateFormat.parse(DateFormat.java:366)
    at com.pruebas.pruebas.fechas.main(fechas.java:14)

我该如何解决这个问题?

您的代码有问题:

  1. 解析模式应与给定的日期时间字符串相匹配。您在解析模式中遗漏了 'T'
  2. 此外,对于 “小时中的分钟”,您使用了 M 而不是 m。符号 M 用于 “年中的月份”。仔细阅读documentation

模式正确的演示:

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

public class Main {
    public static void main(String[] args) throws ParseException {
        String date = "2021-05-14T09:26:20";
        SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date newDate = parser.parse(date);
        System.out.println(format.format(newDate));
    }
}

ONLINE DEMO

介绍 java.time,现代日期时间 API:

请注意,java.util 日期时间 API 及其格式 API、SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*,于 2014 年 3 月作为 Java SE 8 标准库的一部分发布。

解决方案使用 java.time,现代日期时间 API:

现代日期时间 API 基于 ISO 8601 并且不需要明确使用 DateTimeFormatter 对象,只要日期时间字符串符合 ISO 8601 标准.

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String date = "2021-05-14T09:26:20";
        LocalDateTime ldt = LocalDateTime.parse(date);
        System.out.println(ldt);
        
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss", Locale.ENGLISH);
        System.out.println(dtf.format(ldt));
    }
}

输出:

2021-05-14T09:26:20
2023-02-14 09:02:20

ONLINE DEMO

在这里,您可以使用 y 而不是 u 但是 .

Trail: Date Time.

了解有关现代日期时间 API 的更多信息

* 无论出于何种原因,如果您必须坚持Java 6 或Java 7,您可以使用ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and

虽然@Arvind 给出了一些很好的解释和示例,但您在这个特定实例中的问题只是一个错字。字符串:

String date = "2021-05-14T09:26:20";

根据 ISO-8601 标准包含一个 T 文字,用于将日期与时间分开。您只是在 SimpleDateFormat 中忘记了这一点:

SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");

你应该有这个:

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

一切都应该有效。