Java “无法理解”;YYYY-MM-DDTHH:MM:SS“;日期格式
我正在尝试解析以下日期时间字符串 2018-01-30T23:59:59.000 我无法理解它是UTC还是ISO_8601标准格式 以以下方式进行分析时:Java “无法理解”;YYYY-MM-DDTHH:MM:SS“;日期格式,java,simpledateformat,Java,Simpledateformat,我正在尝试解析以下日期时间字符串 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");
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");
看
更新:您的字符串的格式为
yyyy-MM-dd'T'HH:mm:ss.SSS
但您正试图用一个完全大写格式的字符串来解析它
这不符合您的要求,您应该您需要转义文本
T
:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:SS");
看
更新:您的字符串的格式为
yyyy-MM-dd'T'HH:mm:ss.SSS
但您正试图用一个完全大写格式的字符串来解析它
这不符合您的要求,您应该查看的文档并尝试以下操作:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
请参阅的文档并尝试以下操作:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
这张照片是:
2018-01-30T23:59:59
您的字符串是ISO 8601格式。UTC或协调世界时不是一种格式,它是一种标准时间,用于定义我们各自时区中剩余使用的时间
您所使用的日期时间类,SimpleDateFormat
和date
,早已过时,而前者尤其麻烦。我建议您改用java.time
,现代java日期和时间API。和你一起工作真是太好了
LocalDateTime
是一个带有时间的日期,没有时区或与UTC的偏移量。它的一个参数parse
方法解析ISO8601,这就是为什么不需要显式格式化程序的原因
你的代码出了什么问题
您的格式模式字符串有许多问题。这就是为什么您应该欣赏没有任何显式格式化程序的上述解决方案的原因之一。第一个错误是:格式模式字符串有一个冒号,:
,介于秒和毫秒之间,而日期时间字符串有一个点,
。这就是为什么会出现异常
但是,修复此问题后,您的代码将生成以下日期:
2017年12月31日星期日23:00:00 CET
离预期的时间还有一个月,分秒都不见了。因为:
- 大写字母
表示基于周的年份,仅对周数有用。年份需要小写字母YYYY
yyyy
- 大写
表示一年中的某一天。您需要使用小写字母DD
表示月日dd
- 您正确使用了月份的大写字母
。再尝试几分钟也不行。也许你现在已经猜到了:它是小写的MM
mm
- 毫不奇怪,你需要小写的
数秒ss
- 使用
毫秒是很有趣的MS
将其作为月份的SimpleDataFormat
(我们之前已经有过两次),大写的M
表示毫秒。相反,您需要大写的S
表示三位毫秒SSS
- 解释如何使用
java.time
- 关于UTC
SimpleDateFormat
和date
,早已过时,而前者尤其麻烦。我建议您改用java.time
,现代java日期和时间API。和你一起工作真是太好了
LocalDateTime
是一个带有时间的日期,没有时区或与UTC的偏移量。它的一个参数parse
方法解析ISO8601,这就是为什么不需要显式格式化程序的原因
你的代码出了什么问题
您的格式模式字符串有许多问题。这就是为什么您应该欣赏没有任何显式格式化程序的上述解决方案的原因之一。第一个错误是:格式模式字符串有一个冒号,:
,介于秒和毫秒之间,而日期时间字符串有一个点,
。这就是为什么会出现异常
但是,修复此问题后,您的代码将生成以下日期:
2017年12月31日星期日23:00:00 CET
离预期的时间还有一个月,分秒都不见了。因为:
- 大写字母
表示基于周的年份,仅对周数有用。年份需要小写字母YYYY
yyyy
- 大写
表示一年中的某一天。您需要使用小写字母DD
表示月日dd
- 您正确使用了月份的大写字母
。再尝试几分钟也不行。也许你现在已经猜到了:它是小写的MM
mm
- 毫不奇怪,你需要小写的
数秒ss
- 使用
毫秒是很有趣的MS
将其作为月份的SimpleDataFormat
(我们之前已经有过两次),大写的M
表示毫秒。相反,您需要大写的S
表示三位毫秒SSS
- 解释如何使用
java.time
- 关于UTC
SimpleDateFormat
类。它不仅早已过时,而且还出了名的麻烦。今天我们的生活好多了。您的字符串是ISO 8601,java中的LocalDateTime
。time
将在没有任何显式格式设置程序的情况下对其进行解析,因此您在使用格式模式字符串时不会遇到问题。的可能重复。或者,正如您所看到的,可能是的重复。我建议您避免使用SimpleDateFormat
类。不仅仅是朗