java.text.ParseException:无法解析的日期“yyyy-MM-dd'T'HH:mm:ss.SSSXXX” - SimpleDateFormat

问题描述 投票:0回答:4

我使用以下代码来解析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);
}

并尝试解析日期时间值,如下所示:

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"时,该功能正常工作。我不知道为什么。

java date simpledateformat datetime-parsing
4个回答
5
投票

问题来自:

Date date = originalMonthYear.parse(tranDateTime);

这个日期

2017-08-16T00:00:00Z

与模式不匹配

yyyy-MM-dd'T'HH:mm:ss.SSSXXX

因为缺少毫秒(SSS部分)

所以

Date date = originalMonthYear.parse(tranDateTime);

抛出异常

java.text.ParseException: Unparseable date: "2017-08-16T00:00:00Z"

解决方案

  • 将您的日期2017-08-16T00:00:00Z更改为2017-08-16T00:00:00.000Z(将毫秒添加到您的日期)
  • 将您的模式yyyy-MM-dd'T'HH:mm:ss.SSSXXX更改为yyyy-MM-dd'T'HH:mm:ssXXX(从模式中删除毫秒)

3
投票

你在评论中问道:

此外,日期时间值可以是从数据库中检索的“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日期和时间API java.timeSimpleDateFormatDate已经过时了,而前者特别臭名昭着。现代API可以更好地使用。

您的字符串(尽管存在差异)均符合ISO 8601(日期和时间格式标准)。 java.time类解析这些格式,没有任何明确的格式化程序。

链接:Oracle tutorial: Date Time解释如何使用java.time


1
投票

2017-08-16T00:00:00Z改为2017-08-16T00:00:00.000Z,它对我有用。


1
投票

问题来源:

问题来自尝试使用日期格式2017-08-16T00:00:00Z来解析日期值yyyy-MM-dd'T'HH:mm:ss.SSSXXX,在行中:

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<SimpleDateFormat> myUsedPatterns = new ArrayList<>();

myUsedPatterns.add(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"));
myUsedPatterns.add(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"));

for (SimpleDateFormat myPattern : myUsedPatterns) {
    try {
        SimpleDateFormat originalMonthYear = new SimpleDateFormat(myPattern );
        Date date = originalMonthYear.parse(tranDateTime);

        SimpleDateFormat formatter = new SimpleDateFormat(toDateFormat);
        return formatter.format(date);

    } catch (ParseException e) {
        // Loop
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.