日期解析异常 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]

虽然 ISTGMT+05:30CST 可以解析为时区缩写,但 GMT+1 不能。所以我指示我的格式化程序解析 localized offset 如果可以的话。模式字母 O 以英语(和大多数其他语言环境)解析 GMT+1。然后尝试解析时区缩写。格式模式字符串中的方括号表示可选部分。

下一个挑战是 ISTCST 像许多时区缩写一样含糊不清。因此,我还为格式化程序提供了一组首选时区,用于解决歧义。您需要决定您希望这些缩写表示哪些时区,并提供一组相应的 ZonedId 对象。