Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.text.ParseException:不可解析的日期“;yyyy-MM-dd';T';HH:mm:ss.SSSXXX”;-日期格式_Java_Date_Simpledateformat_Datetime Parsing - Fatal编程技术网

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日期和时间API
SimpleDateFormat
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