从具有一位数小时偏移量的字符串中解析日期时间

Parse date-time from String with offset with one-digit hours

我需要解析 Java 中的日期。我有字符串值 2018-05-15 09:32:51.550082 +3:00,我需要将它解析为日期时间。我尝试解析为 ZonedDateTime,但在索引 10 处出现错误。尝试使用 DateTimeFormatter 解析器 'yyyy-MM-dd HH:mm:ss.SSSSSS Z' 进行解析,但在索引 26 处出现错误。显然我的 UTC 偏移量为 +3:00 无法解析。我该怎么做?

MadProgrammer 的评论很有帮助。谢啦。 起初我在时区的 3 之前添加 0,我的字符串变成了 '2018-05-15 09:32:51.550082 +03:00' 然后我使用 DateTimeFormatter 'yyyy-MM-dd HH:mm:ss.n z' 并且现在一切正常。感谢大家

Java 9 及更高版本允许:

    String dateTimeString = "2018-05-15 09:32:51.550082 +3:00";
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("uuuu-MM-dd HH:mm:ss.SSSSSS ")
            .appendOffset("+H:MM:ss", "+0:00")
            .toFormatter();
    OffsetDateTime dateTime = OffsetDateTime.parse(dateTimeString, formatter);
    System.out.println(dateTime);

输出:

2018-05-15T09:32:51.550082+03:00

对于 Java 8 或 ThreeTen Backport,您可能需要在解析之前准备日期时间字符串:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS XXX");
    dateTimeString 
            = dateTimeString.replaceFirst("([+-])(\d(?::\d\d){0,2})$", "");

其余同上,结果相同。 replaceFirst 调用在 +3:00 之间插入一个 0,但前提是小时数仅为一位数。正则表达式难以阅读,因此您会更喜欢 Java 9 解决方案。

正如评论中已经讨论的那样,困难的部分是 +3:00 的偏移量。 Java 的内置格式化程序和可用于指定您自己的格式的格式模式字母都需要偏移量中的两位数小时。我使用的 DateTimeFormatterBuilder.appendOffset 方法允许指定有限数量的格式; Java8 中有 9 种不同的格式; 22 在 Java 9.