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

标签 java date datetime datetime-format java-time

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

在 SWAPI ( https://swapi.co/documentation#people ) 中,您可以读取创建编辑日期,格式如下:

2014-12-09T13:50:51.644000Z

这个日期的描述是: enter image description here

但是在 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.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);

输出:

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);

Created 2014-12-09T13:50:51.000644

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

关于java - DateTimeFormatter 中的格式化程序用于 ISO 8601 时间日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55077387/

相关文章:

java - 错误 400 错误请求

java - 反编译后$SwitchMap$错误

多维数组中的Java空指针异常

python - 在 Python 中获取自午夜以来的秒数

java - 比较Java中的两个日期

php - 比较有问题的php中的日期

asp.net-mvc - 如何在.NET MVC3 HTML 表单中所需的可空日期时间中允许空值?

javascript - 获取日期和时间的 GMT 时间

jar 中的 Java 访问文件导致 java.nio.file.FileSystemNotFoundException

c# - DateTime.FromOADate 返回与 Excel 中的日期不同的日期