【问题标题】:Parsing a date using DateTimeFormatter ofPattern使用 DateTimeFormatter ofPattern 解析日期
【发布时间】:2016-02-02 14:58:21
【问题描述】:

我正在尝试使用java.time.format.DateTimeFormatter 解析包含日期和时间的字符串(我的最终目标是将此字符串中的日期转换为java.time.LocalDate)。

我在尝试解析日期时不断收到 DateTimeParseExceptions。有人可以帮忙吗?

日期格式为“2015-07-14T11:42:12.000+01:00”。

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-ddTHH:mm:ss.SSSZ");
LocalDateTime temp = LocalDateTime.ofInstant(Instant.from(f.parse(this.dateCreated)), 
                 ZoneId.systemDefault());
LocalDate localDate = temp.toLocalDate();

我尝试了 ofPattern 的不同变体,例如尝试通过用单引号将 T 括起来(如上所述)来转义它,并对 .并且我尝试过同时逃离两者。

冒号也需要转义吗?

感谢任何帮助。

【问题讨论】:

    标签: java parsing datetime-format date-parsing datetimeformatter


    【解决方案1】:

    应该是

    DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
    
    //or
    
    DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSz");
    

    而不是

    DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-ddTHH:mm:ss.SSSZ");
    

    来自 JAVADoc:

    偏移 X 和 x:这会根据模式的数量格式化偏移 字母。一个字母只输出小时,例如“+01”,除非 分钟不为零,在这种情况下,分钟也会被输出,例如 '+0130'。两个字母输出小时和分钟,没有冒号, 例如“+0130”。三个字母输出小时和分钟,一个 冒号,例如“+01:30”。四个字母输出小时和分钟, 可选的第二个,不带冒号,例如 '+013015'。五个字母 输出小时和分钟以及可选的秒,带冒号,例如 '+01:30:15'。六个或更多字母会引发 IllegalArgumentException。 当偏移量为时,图案字母'X'(大写)将输出'Z' 输出将为零,而模式字母“x”(小写)将 输出“+00”、“+0000”或“+00:00”。

    【讨论】:

    • 感谢您的回复,但是当我运行将上述日期传递给此方法的单元测试时,我仍然遇到异常。异常消息是“无法在索引 23 处解析文本 '2015-07-14T11:42:07.000+01:00'”。这与您在 Z 周围放置的单引号有关吗?因为我不认为这些是必要的。
    • 对不起Z 应该没有单引号。在+01:00 中将hhmm: 分开时,还要使用小z
    • 啊,谢谢。 :) 我最终通过使用“yyyy-MM-dd'T'HH:mm:ss.SSSXXX”让它工作。不过,不太了解 X、Z 和 z 之间的区别。它适用于三个 X,但不是一个 X。也不明白为什么三个 X 有效,因为那里有超过 3 个字符。
    • 你可以使用XXX,因为它是11:42:12.000+01:00。我在解决方案中添加了来自 JAVADoc 的描述。
    【解决方案2】:

    “yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ”和“yyyy-MM-dd'T'HH:mm:ss.SSSVV”都可以。请注意,5 个 Z 有效,但也不少

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多