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

时间:2019-03-09 12:32:35

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

我对npm install --save-dev @fortawesome/fontawesome-free 格式化程序有疑问。

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

edited

此日期的描述为: enter image description here

但是在预定义格式器部分的 Class DateTimeFormatter 文档中,我看不到任何与SWAPI日期示例匹配的格式器。

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

2014-12-09T13:50:51.644000Z

并使用 nnnnnn

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

您知道哪种格式正确吗?

1 个答案:

答案 0 :(得分: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