我正在尝试将其转换为可读格式,但是,继续获取
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();
}
我读到了有关添加语言环境的信息,正如其他答案所建议的那样,但它仍然不起作用。
您正在解析一个不能正确表示该模式的字符串,您缺少时区...类似于:
-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();
}
根据 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);
阅读 SimpleDateFormat 的 Javadoc,我发现使用
Z
表示时区是非常严格的。它不会将 "Z"
识别为祖鲁语,它只接受数字时区偏移量。
您可能想尝试 X
,根据文档,它接受 "Z"
。
请尝试这种格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
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
一些要点:
java.util.Date
的实例,请让 java.time
API 完成解析日期时间字符串的繁重工作,并使用 zdt
将上述代码中的 java.util.Date
转换为 Date.from(zdt.toInstant())
实例.Z
表示零时区偏移,即时区偏移 +00:00
小时。您应该使用
X
解析非默认格式的偏移日期时间字符串中的区域偏移量。
区域偏移格式示例 | 图案 |
---|---|
|
|
|
|
|
|
|
|
因此,要解析偏移日期时间字符串中
Z
(或 +00:00
)的时区偏移(该字符串不是 OffsetDateTime
的默认格式),您应该使用 XXX
。查看文档以了解更多信息。
了解有关现代日期时间 API 的更多信息
一些有用的链接:
Locale
。
java.time
API 与 JDBC。