如何将 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)
我该如何解决这个问题?
您的代码有问题:
- 解析模式应与给定的日期时间字符串相匹配。您在解析模式中遗漏了
'T'
。
- 此外,对于 “小时中的分钟”,您使用了
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));
}
}
介绍 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
在这里,您可以使用 y
而不是 u
但是 .
了解有关现代日期时间 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");
一切都应该有效。
我正在尝试将 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)
我该如何解决这个问题?
您的代码有问题:
- 解析模式应与给定的日期时间字符串相匹配。您在解析模式中遗漏了
'T'
。 - 此外,对于 “小时中的分钟”,您使用了
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));
}
}
介绍 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
在这里,您可以使用 y
而不是 u
但是
* 无论出于何种原因,如果您必须坚持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");
一切都应该有效。