java.text.ParseException:不可解析的日期“;yyyy-MM-dd';T';HH:mm:ss.SSSXXX”;-日期格式
我使用以下代码来解析java.text.ParseException:不可解析的日期“;yyyy-MM-dd';T';HH:mm:ss.SSSXXX”;-日期格式,java,date,simpledateformat,datetime-parsing,Java,Date,Simpledateformat,Datetime Parsing,我使用以下代码来解析datetime: String parseDate(String tranDateTime, String originalDateFormat, String toDateFormat) throws ParseException { SimpleDateFormat originalMonthYear = new SimpleDateFormat(originalDateFormat); Date date = originalMonthYear.par
datetime
:
String parseDate(String tranDateTime, String originalDateFormat, String toDateFormat) throws ParseException {
SimpleDateFormat originalMonthYear = new SimpleDateFormat(originalDateFormat);
Date date = originalMonthYear.parse(tranDateTime);
SimpleDateFormat formatter = new SimpleDateFormat(toDateFormat);
return formatter.format(date);
}
并尝试按如下方式分析datetime值:
parseDate("2017-08-16T00:00:00Z",
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX", "yyyy-MM-dd HH:mm:ss");
将引发异常:
java.text.ParseException:不可解析日期:“2017-08-16T00:00:00Z”
但是,当我将日期值更改为
“2017-08-16T02:54:15.537Z”
时,该函数工作正常。我不知道为什么。将2017-08-16T00:00:00Z
更改为2017-08-16T00:00:00.000Z
,这对我很有效。问题来自:
Date date = originalMonthYear.parse(tranDateTime);
这个日期
2017-08-16T00:00:00Z
与模式不匹配
yyyy-MM-dd'T'HH:mm:ss.SSSXXX
因为缺少毫秒(SSS
part)
所以
抛出异常
java.text.ParseException: Unparseable date: "2017-08-16T00:00:00Z"
解决方案
- 将日期
更改为2017-08-16T00:00:00Z
(将毫秒添加到日期)2017-08-16T00:00:00.000Z
- 将模式更改为
(从模式中删除毫秒)yyyy-MM-dd'HH:MM:ss.SSSXXX
yyyy-MM-dd'HH:MM:ss.SSSXXX
对日期值2017-08-16T00:00:00Z
进行PAR,行中为:
Date date = originalMonthYear.parse(tranDateTime);
请参见值和格式之间的差异:
______________________________
|2017|08|16| T |00|00|00Z |
|yyyy|MM|dd|'T'|HH|mm|ss.SSSXXX|
|____|__|__|___|__|__|_________|
解决方案:
简单的一点是:
Date date = originalMonthYear.parse("2017-08-16T00:00:00.000Z")
但是,如果您将获得许多不同的格式,您可以使用类似(从未测试过):
List myUsedPatterns=new ArrayList();
添加(新的简化格式(“yyyy-MM-dd'T:HH:MM:ssXXX”);
添加(新的简化格式(“yyyy-MM-dd'HH:MM:ss.SSSXXX”);
对于(SimpleDataFormat myPattern:myUsedPatterns){
试一试{
SimpleDateFormat originalMonthYear=新的SimpleDateFormat(myPattern);
Date-Date=originalMonthYear.parse(transdatetime);
SimpleDataFormat格式化程序=新的SimpleDataFormat(toDateFormat);
返回格式化程序。格式(日期);
}捕获(解析异常){
//环路
}
}
您在评论中问道:
此外,日期时间值可以是“2017-08-16T00:00:00Z”或
从数据库中检索到“2017-08-16T00:00:15.537Z”。我们有电话吗
解析这两种格式的通用模式
更好的是,它们都可以在没有显式模式的情况下解析:
System.out.println(OffsetDateTime.parse("2017-08-16T00:00:00Z"));
System.out.println(OffsetDateTime.parse("2017-08-16T00:00:15.537Z"));
这张照片是:
2017-08-16T00:00Z
2017-08-16T00:00:15.537Z
要格式化,例如:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(OffsetDateTime.parse("2017-08-16T00:00:00Z").format(formatter));
这张照片
2017-08-16 00:00:00
我正在使用并热情推荐
java.time
,这是一种现代的java日期和时间APISimpleDateFormat
和Date
早已过时,而前者尤其令人讨厌。现代的API非常好用
您的字符串(尽管存在差异)都符合日期和时间格式的标准ISO8601。java.time
类在没有任何显式格式化程序的情况下解析这些格式
链接:解释如何使用
java.time
这是正确的答案。您正在使用SSSXXX
设置时间格式,因此需要毫秒的测量值和时区。您使用Z表示时区,但没有以毫秒为单位的度量,因此您的解析器无法解析它。“我不知道为什么?”因为您告诉您的程序这样做。模式包括毫秒部分的.SSS
。2017-08-16T02:54:15.537Z
之所以有效,是因为您使用的是正确的秒部分格式SS.SSS。SimpleDateFormat
和Date
早已过时,前者尤其令人讨厌。我建议您不要使用它们,而是使用。另外,OffsetDateTime.parse(String)
将在不使用任何显式格式化程序的情况下解析两个示例字符串。Instant.parse(“2017-08-16T00:00:00Z”)
工作正常,如下所示。是时候抛弃那些可怕的旧遗留类了Date
&SimpleDateFormat
。现在被内置在Java8和Java9中的类所取代。看,PeterT,也许你应该考虑接受一个答案?如果不难选择的话。此外,请参见,日期时间值可以是从数据库检索到的“2017-08-16T00:00:00Z”或“2017-08-16T00:00:15.537Z”。我们有解析这两种格式的通用模式吗?如果否,我必须使用If条件来解析每个format@PeterT您可以轻松地检查要解析的字符串的长度
,以了解使用哪种模式。我建议您只使用一种模式。表示日期和时间的国际标准化组织(ISO)是,它定义使用此日期时间模式yyyy-MM-dd'T'HH:MM:ssXXX
(即:2018-02-20T18:50:31Z
)@PeterT,您可以以正确的方式使用抛出的异常来使用许多格式模式,看看我编辑过的答案。不管是谁否决了这个答案,请你写一篇评论,说明原因好吗?让我们大家学习。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(OffsetDateTime.parse("2017-08-16T00:00:00Z").format(formatter));
2017-08-16 00:00:00