1 回答

TA貢獻1845條經(jīng)驗 獲得超8個贊
這是 Java 8 中的一個錯誤。
Java 8 的解決方法
? ? DateTimeFormatter globalFormat = new DateTimeFormatterBuilder()
? ? ? ? ? ? .appendPattern("yyyyMMddHHmmss")
? ? ? ? ? ? .appendValue(ChronoField.MILLI_OF_SECOND, 3)
? ? ? ? ? ? .toFormatter();
? ? String input = "2019082905020425";
? ? String adaptedInput = input + "0";
? ? LocalDateTime currentDateTime = LocalDateTime.parse(adaptedInput, globalFormat);
? ? System.out.println("Parsed date and time: " + currentDateTime);
此代碼片段的輸出為(在 jdk-1.8.0_121 上測試):
解析的日期和時間:2019-08-29T05:02:04.250
Java 8 無法分隔整數(shù)字段(如)ss和小數(shù)字段(如),SS而它們之間沒有任何分隔符。解決方法是將分數(shù)也解析為整數(shù)。您的字符串包含百分之一秒,并且沒有內(nèi)置整數(shù)字段。因此,我附加一個額外的0(零),以便我們得到毫秒,然后用于ChronoField.MILLI_OF_SECOND解析。
這是否真的是一個錯誤可能還有爭議。文檔中從未嚴格承諾它應(yīng)該有效,但這似乎是許多人的期望,無論如何他們在 Java 9 中修復(fù)了它。
我又進行了一項更正,您需要檢查這是否是您想要的更正:小寫字母hh表示從 01 點到 12 點之間的 AM 或 PM 內(nèi)的小時。如果您打算這樣做,則需要指定是要 AM 還是 PM。相反,我假設(shè) 05 是一天中從 00 到 23 的一個小時。使用大寫字母HH來解析它。
這是一個選項,可以完全節(jié)省我們的顯式格式化程序:
? ? String input = "2019082905020425";
? ? String adaptedInput = input.replaceFirst(
? ? ? ? ? ? "^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})$",
? ? ? ? ? ? "$1-$2-$3T$4:$5:$6.$7");
? ? LocalDateTime currentDateTime = LocalDateTime.parse(adaptedInput);
結(jié)果和以前一樣。就我而言,我發(fā)現(xiàn)后一種代碼更難閱讀和維護。另外,一旦您遷移到 Java 9 或更高版本,我認為上面的第一個代碼片段可以更直接地返回到您開始的代碼,這就是您最終想要的。選擇您喜歡的解決方案。
該代碼適用于 Java 9 及更高版本
在 Java 9 及更高版本上,我們只需要從hh到進行更改即可使問題中的代碼正常工作。HH
添加回答
舉報