无法理解 "YYYY-MM-DDTHH:MM:SS" 日期格式
Not able to understand "YYYY-MM-DDTHH:MM:SS" date format
我正在尝试解析以下日期时间字符串
2018-01-30T23:59:59.000
我无法理解它是哪种标准格式,例如 UTC 或 ISO_8601
同时按以下方式解析:
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD'T'HH:MM:SS:MS");
Date date = null;
try {
date = sdf.parse("2018-01-30T23:59:59.000");
} catch (ParseException e) {
e.printStackTrace();
}
但它抛出以下异常:
java.text.ParseException: Unparseable date: "2018-01-30T23:59:59.000"
感谢任何帮助。
您需要转义文字 T
:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:SS");
见This SO Answer for more examples
更新:您的字符串格式为
yyyy-MM-dd'T'HH:mm:ss.SSS
但您正在尝试使用完全大写的格式字符串来解析它。
这不符合您的要求,您应该 read the documentation on SimpleDateFormat and the format string placeholders
查看 SimpleDateFormat 的文档并试试这个:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
LocalDateTime dateTime = LocalDateTime.parse("2018-01-30T23:59:59.000");
System.out.println(dateTime);
这会打印:
2018-01-30T23:59:59
您的字符串采用 ISO 8601 格式。 UTC 或 Coordinated Universal Time 不是一种格式,它是一种标准时间,用于定义在我们各自时区使用的其余时间。
您使用的 类 日期时间 SimpleDateFormat
和 Date
早已过时,前者尤其麻烦。我建议您改用 java.time
,现代 Java 日期和时间 API。与它一起工作要好得多。
A LocalDateTime
是一个带有时间的日期,没有时区或与 UTC 的偏移量。它的一个参数 parse
方法解析 ISO 8601,这就是为什么不需要显式格式化程序的原因。
你的代码出了什么问题
您的格式模式字符串有很多问题。这就是为什么您应该在没有任何显式格式化程序的情况下欣赏上述解决方案的原因之一。出错的第一件事是:您的格式模式字符串在秒和毫秒之间有一个冒号 :
,而您的日期时间字符串有一个点 .
。这就是您得到异常的原因。
但是,修复此问题后,您的代码会产生以下结果 Date
:
Sun Dec 31 23:00:00 CET 2017
比预想的差了一个月,分秒不差。因为:
- 大写
YYYY
用于基于周的年份,仅对周数有用。年份需要小写 yyyy
。
- 大写
DD
表示一年中的某一天。您需要小写 dd
作为月份中的第几天。
- 您正确地使用大写
MM
表示月份。几分钟后再次尝试同样的操作是行不通的。也许你现在可以猜到:它是小写 mm
.
- 不足为奇你需要小写
ss
秒。
- 使用
MS
毫秒很有趣。 SimpleDateFormat
将其视为 M
月份(我们之前已经有过两次)和大写 S
毫秒。相反,您需要大写 SSS
表示毫秒的三位数。
链接
我正在尝试解析以下日期时间字符串
2018-01-30T23:59:59.000
我无法理解它是哪种标准格式,例如 UTC 或 ISO_8601
同时按以下方式解析:
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD'T'HH:MM:SS:MS");
Date date = null;
try {
date = sdf.parse("2018-01-30T23:59:59.000");
} catch (ParseException e) {
e.printStackTrace();
}
但它抛出以下异常:
java.text.ParseException: Unparseable date: "2018-01-30T23:59:59.000"
感谢任何帮助。
您需要转义文字 T
:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:SS");
见This SO Answer for more examples
更新:您的字符串格式为
yyyy-MM-dd'T'HH:mm:ss.SSS
但您正在尝试使用完全大写的格式字符串来解析它。
这不符合您的要求,您应该 read the documentation on SimpleDateFormat and the format string placeholders
查看 SimpleDateFormat 的文档并试试这个:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
LocalDateTime dateTime = LocalDateTime.parse("2018-01-30T23:59:59.000");
System.out.println(dateTime);
这会打印:
2018-01-30T23:59:59
您的字符串采用 ISO 8601 格式。 UTC 或 Coordinated Universal Time 不是一种格式,它是一种标准时间,用于定义在我们各自时区使用的其余时间。
您使用的 类 日期时间 SimpleDateFormat
和 Date
早已过时,前者尤其麻烦。我建议您改用 java.time
,现代 Java 日期和时间 API。与它一起工作要好得多。
A LocalDateTime
是一个带有时间的日期,没有时区或与 UTC 的偏移量。它的一个参数 parse
方法解析 ISO 8601,这就是为什么不需要显式格式化程序的原因。
你的代码出了什么问题
您的格式模式字符串有很多问题。这就是为什么您应该在没有任何显式格式化程序的情况下欣赏上述解决方案的原因之一。出错的第一件事是:您的格式模式字符串在秒和毫秒之间有一个冒号 :
,而您的日期时间字符串有一个点 .
。这就是您得到异常的原因。
但是,修复此问题后,您的代码会产生以下结果 Date
:
Sun Dec 31 23:00:00 CET 2017
比预想的差了一个月,分秒不差。因为:
- 大写
YYYY
用于基于周的年份,仅对周数有用。年份需要小写yyyy
。 - 大写
DD
表示一年中的某一天。您需要小写dd
作为月份中的第几天。 - 您正确地使用大写
MM
表示月份。几分钟后再次尝试同样的操作是行不通的。也许你现在可以猜到:它是小写mm
. - 不足为奇你需要小写
ss
秒。 - 使用
MS
毫秒很有趣。SimpleDateFormat
将其视为M
月份(我们之前已经有过两次)和大写S
毫秒。相反,您需要大写SSS
表示毫秒的三位数。