【问题标题】:Formatter in DateTimeFormatter for ISO 8601 date format of the timeDateTimeFormatter 中的格式化程序,用于时间的 ISO 8601 日期格式
【发布时间】:2019-03-09 12:32:35
【问题描述】:

我有一个关于DateTimeFormatter 格式化程序的问题。

在 SWAPI (https://swapi.co/documentation#people) 中,您可以阅读 creatededited 日期,格式如下:

2014-12-09T13:50:51.644000Z

这个日期的描述是:

但在 Predefined Formatters 部分的 Class DateTimeFormatter 文档中,我看不到任何与 SWAPI 日期示例匹配的格式化程序。

问题是,当我尝试解析它时,正在使用 SSSSSS

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'")

还有 nnnnnn

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnn'Z'")

知道哪个是正确的格式化程序吗?

【问题讨论】:

标签: java date datetime datetime-format java-time


【解决方案1】:

根据您的情况,您可能根本不需要指定格式化程序。 java.time 类将 ISO 8601 格式解析(并打印)为默认格式,即没有任何显式格式化程序。正如您图片中的描述所说,这就是您所拥有的格式。

但是,您要链接的两个预定义格式化程序与您的示例相匹配:

  1. ISO_INSTANT
  2. ISO_OFFSET_DATE_TIME

使用哪一个取决于您要将字符串解析成的类型的任何要求。解析成Instant 是最简单的。不要指定格式化程序,只需使用Instant.parse

    String swapiCreatedString = "2014-12-09T13:50:51.644000Z";
    Instant created = Instant.parse(swapiCreatedString);
    System.out.println("Created " + created);

输出:

创建于 2014-12-09T13:50:51.644Z

您需要进一步操作解析的日期时间,例如为用户格式化,OffsetDateTime 提供更多可能性:

    OffsetDateTime created = OffsetDateTime.parse(swapiCreatedString);

同样,解析不需要格式化程序。输出与上述相同。

我猜你没有看到上面提到的两个格式化程序匹配的原因包括:

  • 这些示例均不包含秒的小数部分,但格式化程序接受 0 到 9 位小数(含)秒的小数部分。
  • 示例偏移日期时间具有偏移+01:00。你不可能知道Z 也可以用作偏移量。它的发音为“Zulu”,表示 UTC。

更直接地回答您的问题:您的格式都不完全正确。因为正如我所说的 Z 是一个偏移量,你会想要这样解析它而不是一个文字,这样你就可以从字符串中获取偏移量信息。没有它,您将不知道在哪个偏移量处解释 13:50:51.644。 .SSSSSS 表示秒的小数部分是正确的,而.nnnnnn 表示秒的纳秒,在这里不正确。一秒钟有 10^9 纳秒,所以 n 仅在有 9 位纳秒时才有效。也许你自己的例子给出了最好的说明:

    // nnnnnn is incorrect
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnn'Z'");
    String swapiCreatedString = "2014-12-09T13:50:51.644000Z";
    LocalDateTime created = LocalDateTime.parse(swapiCreatedString, formatter);
    System.out.println("Created " + created);

创建于 2014-12-09T13:50:51.000644

您看到51.644 秒已错误地更改为51.000644

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2013-11-11
    相关资源
    最近更新 更多