dca*_*lap 1 java datetime date datetime-format java-time
我有一个关于DateTimeFormatter格式化程序的问题。
在 SWAPI ( https://swapi.co/documentation#people ) 中,您可以阅读日期created和edited日期,格式如下:
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)
知道哪一个是正确的格式化程序吗?
根据您的情况,您可能根本不需要指定格式化程序。java.time 的类解析(并打印)ISO 8601 格式作为它们的默认值,即没有任何显式格式化程序。正如您图片中的描述所说,这是您拥有的格式。
但是,您链接的两个预定义格式化程序与您的示例相匹配:
使用哪一个取决于您要将字符串解析成的类型的任何要求。解析为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)
同样,解析不需要格式化程序。输出与上述相同。
我想您没有看到提到的两个格式化程序匹配的原因包括:
+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。
| 归档时间: |
|
| 查看次数: |
4899 次 |
| 最近记录: |