日期解析异常 EEE MMM dd HH:mm:ss z yyyy 在少数情况下
Date parse exception EEE MMM dd HH:mm:ss z yyyy in few cases
我正在使用这种格式来解析:
SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH)
但是在少数情况下,日期未被解析。
解析错误
Mon Jul 12 13:42:07 GMT+1 2021
Sat Jul 17 09:20:27 IST 2021
并成功解析以下内容:
Sun Oct 11 12:56:41 GMT+05:30 2020
Fri Aug 20 03:33:16 CST 2021
java.time
我建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。解析所有四个字符串是一个挑战。以下格式化程序有效。
// Substitute your own set of preferred zones here
private static final Set<ZoneId> PREFERRED_ZONES
= Set.of(ZoneId.of("Atlantic/Reykjavik"), ZoneId.of("America/Havana"));
private static final DateTimeFormatter PARSER = new DateTimeFormatterBuilder()
.appendPattern("EEE MMM dd HH:mm:ss [O][")
.appendZoneText(TextStyle.SHORT, PREFERRED_ZONES)
.appendPattern("] yyyy")
.toFormatter(Locale.ENGLISH);
尝试一下:
String[] strings = {
"Mon Jul 12 13:42:07 GMT+1 2021",
"Sat Jul 17 09:20:27 IST 2021",
"Sun Oct 11 12:56:41 GMT+05:30 2020",
"Fri Aug 20 03:33:16 CST 2021"
};
for (String string : strings) {
ZonedDateTime zdt = ZonedDateTime.parse(string, PARSER);
System.out.println(zdt);
}
输出为:
2021-07-12T13:42:07+01:00
2021-07-17T09:20:27Z[Atlantic/Reykjavik]
2020-10-11T12:56:41+05:30
2021-08-20T03:33:16-04:00[America/Havana]
虽然 IST
、GMT+05:30
和 CST
可以解析为时区缩写,但 GMT+1
不能。所以我指示我的格式化程序解析 localized offset 如果可以的话。模式字母 O
以英语(和大多数其他语言环境)解析 GMT+1
。然后尝试解析时区缩写。格式模式字符串中的方括号表示可选部分。
下一个挑战是 IST
和 CST
像许多时区缩写一样含糊不清。因此,我还为格式化程序提供了一组首选时区,用于解决歧义。您需要决定您希望这些缩写表示哪些时区,并提供一组相应的 ZonedId
对象。
我正在使用这种格式来解析:
SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH)
但是在少数情况下,日期未被解析。
解析错误
Mon Jul 12 13:42:07 GMT+1 2021
Sat Jul 17 09:20:27 IST 2021
并成功解析以下内容:
Sun Oct 11 12:56:41 GMT+05:30 2020
Fri Aug 20 03:33:16 CST 2021
java.time
我建议您使用 java.time,现代 Java 日期和时间 API,作为您的日期和时间工作。解析所有四个字符串是一个挑战。以下格式化程序有效。
// Substitute your own set of preferred zones here
private static final Set<ZoneId> PREFERRED_ZONES
= Set.of(ZoneId.of("Atlantic/Reykjavik"), ZoneId.of("America/Havana"));
private static final DateTimeFormatter PARSER = new DateTimeFormatterBuilder()
.appendPattern("EEE MMM dd HH:mm:ss [O][")
.appendZoneText(TextStyle.SHORT, PREFERRED_ZONES)
.appendPattern("] yyyy")
.toFormatter(Locale.ENGLISH);
尝试一下:
String[] strings = {
"Mon Jul 12 13:42:07 GMT+1 2021",
"Sat Jul 17 09:20:27 IST 2021",
"Sun Oct 11 12:56:41 GMT+05:30 2020",
"Fri Aug 20 03:33:16 CST 2021"
};
for (String string : strings) {
ZonedDateTime zdt = ZonedDateTime.parse(string, PARSER);
System.out.println(zdt);
}
输出为:
2021-07-12T13:42:07+01:00 2021-07-17T09:20:27Z[Atlantic/Reykjavik] 2020-10-11T12:56:41+05:30 2021-08-20T03:33:16-04:00[America/Havana]
虽然 IST
、GMT+05:30
和 CST
可以解析为时区缩写,但 GMT+1
不能。所以我指示我的格式化程序解析 localized offset 如果可以的话。模式字母 O
以英语(和大多数其他语言环境)解析 GMT+1
。然后尝试解析时区缩写。格式模式字符串中的方括号表示可选部分。
下一个挑战是 IST
和 CST
像许多时区缩写一样含糊不清。因此,我还为格式化程序提供了一组首选时区,用于解决歧义。您需要决定您希望这些缩写表示哪些时区,并提供一组相应的 ZonedId
对象。