java.text.ParseException:无法解析的日期:“2014-06-10T13:37:17.744Z”

问题描述 投票:0回答:2
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
try {
    Date date = df.parse("2014-06-10T13:37:17.744Z");
    dateString = android.text.format.DateFormat.format("MMM d, yyyy, h:mm a", date)
            .toString();
} catch (ParseException e) {
    e.printStackTrace();
}

java.text.ParseException:无法解析的日期:“2014-06-10T13:37:17.744Z”

java android date date-format datetime-parsing
2个回答
3
投票

你还有毫秒:

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

2
投票

java.time

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

java.time
日期时间 API,取代了容易出错的旧版
java.util
日期时间 API
。任何新代码都应使用
java.time
API。

'Z'
Z

不同

'Z'
只是一个字符文字,而
Z
是零时区偏移量的 时区指示符。它代表祖鲁语并指定
Etc/UTC
时区(时区偏移为
+00:00
小时)。

因此,不要在模式

中使用'Z'进行解析/格式化。

使用现代日期时间 API 的解决方案

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

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

Instant instant = Instant.parse("2014-06-10T13:37:17.744Z");
ZonedDateTime zdt = ZonedDateTime.parse("2014-06-10T13:37:17.744Z");
OffsetDateTime odt = OffsetDateTime.parse("2014-06-10T13:37:17.744Z");

演示:

class Main {
    public static void main(String args[]) {
        ZonedDateTime zdt = ZonedDateTime.parse("2014-06-10T13:37:17.744Z");
        System.out.println(zdt);

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

输出:

2014-06-10T13:37:17.744Z
Jun 10, 2014, 1:37 PM

在线演示

注意: 如果由于某种原因,您需要

java.util.Date
的实例,请让
java.time
API 完成解析日期时间字符串的繁重工作,并将上述代码中的
zdt
转换为
java.util.Date
实例使用
Date.from(zdt.toInstant())

Trail:日期时间

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

一些重要链接

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