3 回答

TA貢獻(xiàn)1875條經(jīng)驗 獲得超3個贊
您可以使用和DateTimeFormatterBuilder
重用常量來構(gòu)建模式:ISO_LOCAL_DATE
ISO_LOCAL_TIME
????DateTimeFormatter?formatter?=?new?DateTimeFormatterBuilder() ????????????.append(DateTimeFormatter.ISO_LOCAL_DATE) ????????????.appendLiteral("?") ????????????.append(DateTimeFormatter.ISO_LOCAL_TIME) ????????????.appendPattern("[?Z?z]") ????????????.toFormatter();? ???????????????ZonedDateTime?dt?=?ZonedDateTime.parse(date,?formatter);
訣竅是DateTimeFormatter.ISO_LOCAL_TIME
處理不同數(shù)量的數(shù)字來表示它自己的毫秒數(shù)。來自DateTimeFormatter.ISO_LOCAL_TIME
JavaDoc:
這將返回一個不可變的格式化程序,能夠格式化和解析 ISO-8601 擴展本地時間格式。格式包括:
[..]
納秒級的一到九位數(shù)字。將根據(jù)需要輸出盡可能多的數(shù)字。

TA貢獻(xiàn)1860條經(jīng)驗 獲得超9個贊
DateTimeFormatterBuilder
我認(rèn)為為此目的使用 a 更好。對于可選部分,只需使用以下方法之一:
可選開始()和可選結(jié)束()
使用appendOptional()附加整個可選模式
這是一個例子:
DateTimeFormatter?formatter?=?DateTimeFormatter.ofPattern("" ????+?"[yyyy-MM-dd?HH:mm:ss.SSS?Z?z]" ????+?"[yyyy-MM-dd?HH:mm:ss.SS?Z?z]" ????+?"[yyyy-MM-dd?HH:mm:ss.S?Z?z]" ????+?"[yyyy-MM-dd?HH:mm:ss?Z?z]");
此外,您可以為每個可選的創(chuàng)建一個 dtf 并將它們附加到 appendOptional() 和DateTimeFormatterBuilder
例如 :
DateTimeFormatter?formatter?=?new?DateTimeFormatterBuilder() ????.appendValue(HOUR_OF_DAY,2) ????.optionalStart() ????.appendValue(MINUTE_OF_HOUR,2) ????.optionalEnd() ????.optionalStart() ????.appendValue(SECOND_OF_MINUTE,2) ????.optionalEnd() ????.toFormatter();
此代碼未經(jīng)測試,但每次都嘗試在開始/結(jié)束可選塊中構(gòu)建您的可選模式。

TA貢獻(xiàn)1921條經(jīng)驗 獲得超9個贊
這是我在一個采用不同格式的應(yīng)用程序中使用的示例,您可以看到毫秒是可選的,最后也是“Z”。
new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd'T'HH:mm:ss") .optionalStart() .appendLiteral('.') .appendValue(ChronoField.MILLI_OF_SECOND, 1, 3, SignStyle.NORMAL) .optionalEnd() .optionalStart() .appendLiteral('Z') .optionalEnd() .toFormatter
appendPattern 是靜態(tài)值,其他在內(nèi)部可選的開始和結(jié)束,構(gòu)建這樣的模式非常簡單(如果你當(dāng)然知道如何去做;))
添加回答
舉報