1 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
根據(jù)您的情況,您可能根本不需要指定格式化程序。java.time 類將 ISO 8601 格式解析(并打?。槟J(rèn)格式,即沒有任何顯式格式化程序。正如您圖片中的描述所說,這是您所擁有的格式。
但是,您要鏈接的兩個(gè)預(yù)定義格式化程序與您的示例相匹配:
ISO_INSTANT
ISO_OFFSET_DATE_TIME
使用哪一個(gè)取決于您要將字符串解析成的類型的任何要求。解析為Instant. 不要指定格式化程序,只需使用Instant.parse:
String swapiCreatedString = "2014-12-09T13:50:51.644000Z";
Instant created = Instant.parse(swapiCreatedString);
System.out.println("Created " + created);
輸出:
創(chuàng)建于 2014-12-09T13:50:51.644Z
我需要進(jìn)一步操作解析的日期時(shí)間,例如為用戶格式化它,OffsetDateTime提供更多可能性:
OffsetDateTime created = OffsetDateTime.parse(swapiCreatedString);
同樣,解析也不需要格式化程序。輸出與上述相同。
我猜您沒有看到提到的兩個(gè)格式化程序匹配的原因包括:
這些示例均不包括秒的分?jǐn)?shù),但格式化程序接受 0 到 9 位小數(shù)(包括)秒的分?jǐn)?shù)。
示例偏移日期時(shí)間具有偏移量+01:00。你不知道它也Z可以作為偏移量。它的發(fā)音為“Zulu”,表示 UTC。
更直接地回答您的問題:您的格式都不完全正確。因?yàn)檎缥宜fZ的是一個(gè)偏移量,你會想要這樣解析它而不是一個(gè)文字,這樣你就可以從字符串中獲取偏移量信息。沒有它,您將不知道在哪個(gè)偏移量處解釋 13:50:51.644。.SSSSSS對于秒的小數(shù)部分是正確的,而.nnnnnn表示秒的納秒,這里是不正確的。一秒鐘有 10^9 納秒,所以n只有在有 9 位納秒時(shí)才有效。也許你自己的例子給出了最好的說明:
// 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);
創(chuàng)建于 2014-12-09T13:50:51.000644
您會看到51.644秒數(shù)被錯(cuò)誤地更改為51.000644。
添加回答
舉報(bào)