DateTimeFormatter 中的格式化程序,用于时间的 ISO 8601 日期格式

dca*_*lap 1 java datetime date datetime-format java-time

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

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

2014-12-09T13:50:51.644000Z
Run Code Online (Sandbox Code Playgroud)

这个日期的描述是: 在此处输入图片说明

但在该文档类DateTimeFormatter预定义的格式化程序部分,我不能看到SWAPI日期例子匹配任何格式。

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

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

nnnnnn

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

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

Ole*_*.V. 5

根据您的情况,您可能根本不需要指定格式化程序。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);
Run Code Online (Sandbox Code Playgroud)

输出:

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

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

    OffsetDateTime created = OffsetDateTime.parse(swapiCreatedString);
Run Code Online (Sandbox Code Playgroud)

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

我想您没有看到提到的两个格式化程序匹配的原因包括:

  • 没有一个示例包括秒的分数,但格式化程序接受 0 到 9 位小数(包括)的秒分数。
  • 示例偏移日期时间具有 offset +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);
Run Code Online (Sandbox Code Playgroud)

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

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