当前位置: 首页 > 知识库问答 >
问题:

解析带有Java日期的区域的字符串日期时间

东方权
2023-03-14

我正在尝试在java.time中解析这些日期,然后获取字符串表示形式。

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

我阅读了这个类似的答案,并创建了一个方法来解析上述日期并返回具有所需格式的字符串

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

共有3个答案

盖嘉庆
2023-03-14

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

谭兴学
2023-03-14

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

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

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

DateTimeFormatter.ISO_ZONED_DATE_TIME.parse(dateFull);
陈斌蔚
2023-03-14

你甚至不需要定义一个模式,你的例子是ISO格式的,它们包含一个偏移量而不是一个区域。

这就是为什么您可以使用这种替代方法(如果您想坚持使用< code>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

结果与上面发布的结果相同...

 类似资料:
  • 我想从格式为“2021-12-10T18:49:00-05:00”的字符串中解析带有时区的日期。我尝试使用“date('Y-m-dh:I:s',strotime($myDate))”进行解析。但这是第二天的返回日期。非常感谢您的帮助。

  • 问题内容: 如何将类似“ 01-Jan-1995”的字符串解析为Python对象? 问题答案: 总体来说,您可以使用或模块中的函数来分析日期和时间字符串。您的示例可以解析为: 请注意,解析月份的名称是与语言环境相关的。下表显示了用于解析日期和时间的各种格式的指令。

  • (我想)快速提问。如何将解析为(将时间设置为)? java.time.format.DateTimeParseException:无法分析文本“2007-07-21+00:00”:无法从TemporalAccessor获取OffsetDateTime:{offsetseconds=0},ISO解析为类型java.time.format.Parsed的2007-07-21

  • 问题内容: 我的日期格式为“ yyyy-MM-dd’T’HH:mm:ss.sssZ”。例如,日期为“ 2018-07-17T09:59:51.312Z”。我正在使用下面的代码来解析Java中的String。 这给了我“无法解析的日期:”例外。谁能告诉我该怎么做? 问题答案: 您忘了在 那会做的工作

  • 这就是问题所在: 我有一些带有旅行信息的. csv文件,日期显示为字符串(每一行代表一次旅行): “1-5月和10-12月的所有星期一。6-9月的所有日子” 我必须将字符串解析为日期,并为每次旅行将其保存到一个数组中。 问题是我不知道怎么做。甚至我的大学老师也告诉我,他们不知道如何做到这一点:S。我无法使用http://docs.oracle.com/javase/6/docs/api/java/

  • 本实例演示了如何通过DateFormat类的parse方法根据不同的本地环境解析日期/时间字符串,并将其转换成Date对象。在最后还演示了parse方法如何解析不符合日期/时间逻辑的字符串。 例子 : 解析日期/时间字符串 实例的代码如下: package chapter8; import java.text.DateFormat; import java.util.Date; import ja