【问题标题】:Parse String datetime with Zone with Java Date使用带有 Java 日期的区域解析字符串日期时间
【发布时间】:2022-01-12 09:44:32
【问题描述】:

我正在尝试在 java.time 中解析这些日期,然后获取 String 表示。

2021-12-27T09:15:09.738+02:00
2022-01-11T20:04:21+02:00

我读到了类似的answer,并创建了一个方法来解析上述日期并返回具有所需格式的String

public String getDatetimeFromDatetimeWithT(String dateFull) {
    String date = "";
    
    try {
        LocalDateTime ldate = LocalDateTime.parse(dateFull, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
        date = ldate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    } catch (Exception e) {
        System.out.println(dateFull + " not matched 1 " + e);
    }

    try {
        LocalDateTime ldate = LocalDateTime.parse(dateFull, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"));
        date = ldate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    } catch (Exception e) {
       System.out.println(dateFull + " not matched 2" + e);
    }
    
    return date;
}

但是,没有匹配的模式。我在这里缺少什么?

更新:在这两个日期我都得到了 + 字符的异常。

2021-12-27T09:15:09.738+02:00 not matched 1 java.time.format.DateTimeParseException: Text '2021-12-27T09:15:09.738+02:00' could not be parsed at index 23

2022-01-11T20:04:21+02:00 not matched 2 java.time.format.DateTimeParseException: Text '2022-01-11T20:04:21+02:00' could not be parsed at index 19

【问题讨论】:

  • 您正在使用可能假定 ZonedDateTime 的 OffsetDateTime 表示。使用 ZonedDateTime。

标签: java date


【解决方案1】:

您甚至不需要定义模式,您的示例是 ISO 格式,并且它们包含偏移量而不是区域

这就是为什么你可以使用这个替代方案(如果你想坚持LocalDateTime):

// parse without passing a formatter
OffsetDateTime odtA = OffsetDateTime.parse("2021-12-27T09:15:09.738+02:00");
OffsetDateTime odtB = OffsetDateTime.parse("2022-01-11T20:04:21+02:00");
// extract the LocalDateTimes
LocalDateTime ldtA = odtA.toLocalDateTime();
LocalDateTime ldtB = odtB.toLocalDateTime();
// print them
System.out.println(ldtA);
System.out.println(ldtB);

结果:

2021-12-27T09:15:09.738
2022-01-11T20:04:21

为了让你的方法更短,写这样的东西:

public static String getDatetimeFromDatetimeWithT(String dateFull) throws DateTimeParseException {
    return OffsetDateTime.parse(dateFull)
                         .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}

这基本上将String 参数解析为OffsetDateTime,并仅使用LocalDateTime 具有的信息格式化OffsetDateTime

结果和上面发布的一样……

【讨论】:

    【解决方案2】:

    您的日期模式不正确。 使用这个:

    yyyy-MM-dd'T'HH:mm:ss.SSSXXX
    

    或者使用预定义的ISO 标准类之一为您进行解析:

    DateTimeFormatter.ISO_ZONED_DATE_TIME.parse(dateFull);
    

    【讨论】:

    • 你能写出如何使用DateTimeFormatter.ISO_ZONED_DATE_TIME.parse(dateFull);吗?我试图在 `LocalDateTime ldate = LocalDateTime.parse(dateFull, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"));` 中替换它,但它无效。
    • 您使用的是什么日期字符串?因为它适用于我的测试环境。
    • 您不能使用 LocalDateTime 因为它不跟踪时区。您需要使用 ZonedDateTime 或 OffsetDateTime。 (见我的回答)
    • 好的,非常感谢
    【解决方案3】:

    LocalDateTime 不包含时区信息。为此,您需要使用 ZonedDateTime 或 OffsetDateTime 类。您仍然可以(并且应该恕我直言)使用 DateTimeFormatter。那里有一个名为 ISO_OFFSET_DATE_TIME 的预定义格式化程序,应该可以满足您的需求。不久前,当事先不知道格式时,我需要从字符串中解析日期。所以,我写了一篇关于我的实现想法的文章。你可以阅读它here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-11
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      相关资源
      最近更新 更多