Parse time format yyyy-MM-dd'T'HH:mm:ss.SSS'+'



我正在使用jiraapi,并且在其中一个请求中,我获得了具有日期字段的响应,格式如下:2022-10-26T09:34:00.000+0000。我需要将其转换为LocalDate,但我不知道如何使用这种奇怪的格式。以下是我尝试过的一些格式:

DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
DateTimeFormatter.ISO_LOCAL_DATE_TIME

但两者都不能反序列化日期末尾的+符号。

Text '2022-10-27T09:34:00.000+0000' could not be parsed, unparsed text found at index 24

您必须添加时区:

DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")

签出文档https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

错误消息告诉您,您的DateTimeFormatter无法解析String末尾的+0000的区域偏移量。这是因为DateTimeFormatter.ISO_LOCAL_DATE_TIME只是不期望一个偏移量,它应该只解析

<<ul>
  • 年/gh>
  • 年月号
  • 月号
  • 一天中的小时数
  • 小时分钟
  • 秒/分
  • 秒(和纳米)分数
  • 就是这样!没有抵消!不带!.

    但这也意味着它可以完美地解析所有东西,直到你的例子中的这个偏移量!

    然而,String几乎格式化为OffsetDateTime,但不幸的是,它的ISO格式化程序期望一个偏移量,其中小时和分钟由冒号分隔,例如+00:00,而您的String没有。

    java.time允许您在现有格式化程序的基础上构建自定义格式化程序。这就是为什么我在上面提到除了偏移量之外的所有内容都可以使用DateTimeFormatter.ISO_LOCAL_DATE_TIME进行解析。你可以取那个并附加一个offset-x模式,然后解析你的未分隔偏移量。让我们称它为扩展一个现有的格式化器,这里有一个例子:

    public static void main(String[] args) {
    // your example String
    String someTimes = "2022-10-26T09:34:00.000+0000";
    // build a suitable formatter by extending an ISO-formatter
    DateTimeFormatter dtf = new DateTimeFormatterBuilder()
    .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
    .appendPattern("xxxx")
    .toFormatter(Locale.ENGLISH);
    // then parse
    LocalDate localDate = LocalDate.parse(someTimes, dtf);
    // and print
    System.out.println(localDate);
    }
    
    输出:

    2022-10-26
    
    创建一个带有Locale的格式化器总是一个好主意,但在大多数情况下,如果只解析数值,没有Locale的格式化器可能就足够了。这也适用于DateTimeFormatter.ofPattern(String, Locale)

    最新更新