2016-08-12 43 views
0

解析這個失敗:逗號失敗時java.time.Instant

Instant.parse("2007-12-03T10:15:30,978Z") // Fails with comma 

而這種成功:

Instant.parse("2007-12-03T10:15:30.978Z") // Succeeds with dot 

java.time類解析或生成日期的字符串表示時默認使用標準ISO 8601格式時間值。

ISO 8601標準允許COMMAFULL STOP(點,週期)作爲decimal mark的一小部分秒。 comma is preferred

但是,當我嘗試從包含逗號的輸入字符串中嘗試parseInstant時,會引發DateTimeParseException。帶點的類似字符串反而會成功。

出了什麼問題?我如何解析包含逗號的標準字符串?

回答

0

tl; dr

只有圓點在java.time中有效。只需用點替換逗號即可。

"2007-12-03T10:15:30,978Z".replace("," , ".") 

只有斑點的支持,而不是逗號

在Java 8中,java.time類只期望一個句號(點,期間)字符作爲小數點。

在大多數其他方面,java.time類爲ISO 8601標準格式提供了極好的支持。幸運的是,這個缺陷很容易在你自己的代碼中得到補救。解析ISO 8601字符串時,只需用點替換任何逗號即可。

String input = "2007-12-03T10:15:30,978Z" ; 
Instant instant = Instant.parse(input.replace("," , ".")); 

做相反的事情,使用首選逗號而不是點來輸出字符串。請注意,某些協議和庫可能會偏向任何一個角色。

String output = instant.toString().replace("." , ",") ; 

對於更詳細的討論,看到問題DateTimeFormatter to handle either a FULL STOP or COMMA in fractional secondJDK-8132536

問題頁