如何解决java.text.ParseException:无法解析日期?

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

我正在尝试将其转换为可读格式,但是,继续获取

java.text.ParseException: Unparseable date: "2016-11-18T11:13:43.838Z" (at offset 23)

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
try {
    Date date1 = df.parse("2016-11-18T11:13:43.838Z");

    DateFormat outputFormatter1 = new SimpleDateFormat("dd-MMM-yyyy");
    String output1 = outputFormatter1.format(date1); //
} catch (ParseException e) {
    e.printStackTrace();
}

我读到了有关添加语言环境的信息,正如其他答案所建议的那样,但它仍然不起作用。

java date date-format
5个回答
6
投票

您正在解析一个不能正确表示该模式的字符串,您缺少时区...类似于:

-0600

示例:

Date date1 = df.parse("2016-11-18T11:13:43.838-0600Z");

这里是 doc 了解更多信息....

你的代码应该是这样的:

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    try {
        Date date1 = df.parse("2016-11-18T11:13:43.838-0600Z");
        DateFormat outputFormatter1 = new SimpleDateFormat("dd-MMM-yyyy");
        String output1 = outputFormatter1.format(date1); //
    } catch (ParseException e) {
        e.printStackTrace();
    }

6
投票

根据 docs,格式字符串中的

Z
表示 RFC 822 时区,例如+01:00。您需要解析 ISO 8601 时区(输入字符串中的
Z
表示 UTC 时区)。您可以使用
X
进行配置:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX", Locale.US);

2
投票

阅读 SimpleDateFormat 的 Javadoc,我发现使用

Z
表示时区是非常严格的。它不会将
"Z"
识别为祖鲁语,它只接受数字时区偏移量。 您可能想尝试
X
,根据文档,它接受
"Z"


0
投票

请尝试这种格式

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");

0
投票

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的旧版
java.util
日期时间 API
。任何新代码都应使用
java.time
API。下面给出的是使用现代日期时间 API 的解决方案:

您不需要
DateTimeFormatter

您的日期时间字符串采用 ISO 8601 格式,这也是

java.time
类型默认使用的格式。因此,您不需要明确使用
DateTimeFormatter
,例如

Instant instant = Instant.parse("2016-11-18T11:13:43.838Z");
ZonedDateTime zdt = ZonedDateTime.parse("2016-11-18T11:13:43.838Z");
OffsetDateTime odt = OffsetDateTime.parse("2016-11-18T11:13:43.838Z");

演示:

class Main {
    public static void main(String args[]) {
        ZonedDateTime zdt = ZonedDateTime.parse("2016-11-18T11:13:43.838Z");
        System.out.println(zdt);

        // String representation in a custom format
        String formatted = zdt.format(
                DateTimeFormatter.ofPattern("dd-MMM-uuuu", Locale.ENGLISH));
        System.out.println(formatted);
    }
}    

输出:

2016-11-18T11:13:43.838Z
18-Nov-2016

在线演示

一些要点:

  1. 如果由于某种原因,您需要
    java.util.Date
    的实例,请让
    java.time
    API 完成解析日期时间字符串的繁重工作,并使用
    zdt
    将上述代码中的
    java.util.Date
    转换为
    Date.from(zdt.toInstant())
    实例.
  2. Z
    表示零时区偏移,即时区偏移
    +00:00
    小时。

我应该使用什么符号来解析区域偏移字符串?

您应该使用

X
解析非默认格式的偏移日期时间字符串中的区域偏移量。

区域偏移格式示例 图案
-08
X
-0830
XX
-08:30
XXX
-08:30:15
XXXXX

因此,要解析偏移日期时间字符串中

Z
(或
+00:00
)的时区偏移(该字符串不是
OffsetDateTime
的默认格式),您应该使用
XXX
。查看文档以了解更多信息。

Trail:日期时间

了解有关现代日期时间 API 的更多信息

一些有用的链接

  1. 检查此评论中提到的答案。
  2. 始终为自定义格式指定带有日期时间格式化程序的
    Locale
  3. 检查
  4. 这个答案这个答案以了解如何使用 java.time
     API 与 JDBC。
© www.soinside.com 2019 - 2024. All rights reserved.