使用大寫字母X而不是x,因此XXX。不同之處在於,大X可以將輸入字母「Z」識別爲UTC-Offset +00:00,而小字母X不能。
建議圖案:
yyyy-MM-dd-HH.mm.ss.SSSSSSXXX
請也意識到以下JDK-bug的:
java.time.format.DateTimeFormatter無法解析單 位數小時的偏移
更新:
我現在已經在錯誤日誌中測試了描述的解決方法。
String input = "2014-05-02-10.45.05.993280-5:00";
DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parseLenient().appendOffset("+HH:MM", "Z").toFormatter();
System.out.println(f.parse(input, ZonedDateTime::from));
但它拋出一個異常:線程 「main」 java.time.format.DateTimeParseException
例外: 文本「2014-05-02-10.45.05.993280-5: 00'無法在索引26 上的java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947) 位於HelloWorld.main處的java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849) (你好,世界。java:16)
因此,從寬鬆的解析也沒有幫助。 所以現在只有三個選項留給你:
使用。解決方法由臭蟲記者建議:[...]解決方法是單獨解析日期/時間,使用手工編碼解析器偏移並將LocalDateTime與手解析的偏移量相結合。不是一件容易的工作。
試試你自己的專門的字符串預處理。如果你有一個固定的格式,那麼你可以嘗試在位置26插入零數字(如果總輸入長度是一個數字太小)。
或者你使用一個外部庫,它可以做到這一點。我的庫Time4J(v4.0)可以做到這一點,如果你願意添加額外的依賴。看到這個代碼:
String input = "2014-05-02-10.45.05.993280-5:00"; ZonalDateTime zdt = ZonalDateTime.parse( input, Moment.localFormatter("yyyy-MM-dd-HH.mm.ss.SSSSSSXXX", PatternType.CLDR)); System.out.println(zdt); // 2014-05-02T10:45:05,993280UTC-05:00 ZonedDateTime result = zdt.toTemporalAccessor();
更新:根據JDK-錯誤狀態,該錯誤已修復了Java的9,但對於Java的8一個補丁包,似乎並沒有被儘管如此。
您正在使用哪個版本的Java? –
@JonSkeet - 對不起,更新了原文。 – Cheetah