2 回答

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
你總是想得到同樣的類型,我似乎明白,如果字符串中沒(méi)有偏移量,你需要UTC(重要的是要清楚這一點(diǎn))。我建議指定一個(gè)具有可選UTC偏移量和默認(rèn)值UTC(零偏移量)的格式化程序,以防字符串中沒(méi)有任何偏移量:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendPattern("[X]")
.parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
.toFormatter();
String withoutZ = "2018-07-21T00:50:39";
Instant anInstant = formatter.parse(withoutZ, Instant::from);
System.out.println(anInstant);
String withZ = "2017-11-20T23:18:27.529Z";
Instant anotherInstant = formatter.parse(withZ, Instant::from);
System.out.println(anotherInstant);
輸出:
2018-07-21T00:50:39Z
2017-11-20T23:18:27.529Z
格式模式字符串中的方括號(hào)表示偏移量 X 是可選的。秒上小數(shù)點(diǎn)的存在與否由 處理。[X]
ISO_LOCAL_DATE_TIME
我希望您知道該類設(shè)計(jì)不佳且已經(jīng)過(guò)時(shí),因此通常您不應(yīng)該想要一個(gè),并且您只要求一個(gè),因?yàn)槟豢杀苊獾匦枰粋€(gè)用于傳統(tǒng)API的專用API,而您現(xiàn)在無(wú)法更改。在這種情況下,請(qǐng)從您的問(wèn)題中進(jìn)行最終轉(zhuǎn)換。Date
Instant
通常用于可變?nèi)掌?時(shí)間格式的技術(shù)包括:
依次嘗試許多已知格式。
在確定要使用的格式之前,請(qǐng)先了解一下字符串。在你的情況下,你可能已經(jīng)分支了,正如巴西爾·布爾克的答案中已經(jīng)建議的那樣。
.endsWith("Z")
格式模式中的可選部件。
DateTimeFormatterBuilder.parseDefaulting()
用于已分析字符串中可能不存在的部分。DateTimeFormatter.parseBest()
.
如您所見(jiàn),我正在使用項(xiàng)目3。和 4.這里。

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
時(shí)間
這已經(jīng)被覆蓋了無(wú)數(shù)次。因此,請(qǐng)搜索堆棧溢出以獲取更多信息。
切勿使用 或 。僅使用時(shí)間。同樣,喬達(dá)時(shí)間也被java.time所取代(兩者都由同一個(gè)人斯蒂芬科爾伯恩領(lǐng)導(dǎo))。Date
Calendar
兩個(gè)字符串輸入均采用標(biāo)準(zhǔn) ISO 8601 格式。默認(rèn)情況下,java.time 類在解析/生成字符串時(shí)使用這些格式。
第一個(gè)缺少與 UTC 或時(shí)區(qū)的偏移量指示器,因此它不表示某個(gè)時(shí)刻。
LocalDateTime.parse( "2018-07-21T00:50:39" )
第二個(gè)意思是UTC,發(fā)音為“祖魯”。Z
Instant.parse( "2017-11-20T23:18:27.529Z" )
若要在一種方法中處理這兩種格式,請(qǐng)相應(yīng)地搜索 輸入字符串中是否存在 和 分支。此外,陷阱用于異常,以防您收到意外輸入。Z
如果必須有一個(gè)對(duì)象,請(qǐng)參閱該類 JavaDoc 以獲取新方法 & 在轉(zhuǎn)換為 java.time 類的舊類上。正如我所說(shuō),所有這些都已經(jīng)被涵蓋了很多很多次,所以請(qǐng)搜索更多信息。java.util.Date
from
to…
添加回答
舉報(bào)