从String中解析日期时间,偏移量为一位小时

时间:2018-05-15 07:36:08

标签: java date parsing timezone-offset datetime-parsing

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

2 个答案:

答案 0 :(得分:3)

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})$", "$10$2");

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

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

答案 1 :(得分:0)

MadProgrammer的评论非常有帮助。谢啦。 首先我在时区3之前加0,我的字符串变为'2018-05-15 09:32:51.550082 +03:00'然后我使用DateTimeFormatter'yyyy-MM-dd HH:mm:ss.nz'和一切都有效。感谢所有