2011-12-22 118 views
6

我正在ParseException以下代碼java.text.ParseException:無法解析日期:YYYY-MM-DD HH:MM:SS.SSSSSS

String dateStr = "2011-12-22 10:56:24.389362"; 
    String formatStr = "yyyy-MM-dd HH:mm:ss.SSSSSS"; 
    Date testDate = null; 
    SimpleDateFormat sdf= new SimpleDateFormat(formatStr); 
    sdf.setLenient(false); 
    testDate = sdf.parse(dateStr); 

    System.out.println("CHECK DATE " + sdf.format(testDate)); 

Exception in thread "main" java.text.ParseException: Unparseable date: "2011-12-22 10:56:24.389362" at java.text.DateFormat.parse(DateFormat.java:337)

如果我註釋掉線sdf.setLenient(false),然後我看到輸出的時間差 CHECK DATE 2011-12-22 11:02:53.000362

我在做什麼錯?

回答

7

'S'表示毫秒。一秒鐘內有1000(0到999)毫秒。 389362大於999.額外的389000毫秒將轉換爲389秒或6分29秒並添加到時間。

+0

允許389362應該是什麼模式? – Praneeth 2011-12-22 17:50:25

+0

毫秒是允許的最短時間。你需要改變輸入,所以在示例中只有三位十進制數字'389',格式以'.SSS' – 2011-12-22 17:56:47

+0

結尾。謝謝。要麼我需要改變我的輸入三位十進制數字,或者我需要寫我自己的解析器,允許按@GrailsGuy微秒 – Praneeth 2011-12-22 18:01:14

3

您輸入的毫秒數據不正確。它應該是: -

String dateStr = "2011-12-22 10:56:24.389";

你也不需要在模式「S」 S額外的數量。以下就足夠了:

String formatStr = "yyyy-MM-dd HH:mm:ss.S";

它在java docs明確提到的演示文稿類型的Number

號碼:格式化,模式字母的數量是最小 位數,較短的數字是零填充到這個數量。 對於解析,模式字母的數量被忽略,除非它需要分開兩個相鄰的字段是 。

因爲您要求解析器對解析沒有嚴格要求,所以當您將lenient設置爲true時(或註釋掉默認爲true的行),它起作用。從setLenient()上的java文檔: -

指定日期/時間解析是否是寬鬆的。通過 從寬分析,解析器可以使用啓發式來解釋不精確匹配此對象格式的輸入 。通過嚴格的解析, 輸入必須匹配此對象的格式。

4

S格式說明符指的是毫秒。如果允許寬鬆解析,則最後一部分解釋爲389362毫秒。當到目前爲止添加日期時,最後3位數字(實際上是%1000)成爲實際的毫秒數,並且結束日期約爲389秒(〜6 1/2分鐘),比預期的要晚。 (通過嚴格的解析,解析器知道389362毫秒毫無意義,所以會引發錯誤。)

最簡單的解決方法是,如果可以保證日期總是看起來像那樣,最後3位數字關閉。 (這大約有一半的時間會給你一個關閉一毫秒的日期,但是這比編寫日期解析器要好...)

2

S只能用於milliseconds。如果你想要微秒,你將不得不編寫你自己的解析器。

0

使用toISOString('HH:mm:ss.S')獲得毫秒(3位),然後完全根據您的需要爲0

例如:

new Date().toISOString('HH:mm:ss.S') 

返回 「2012-02-10T12:16:39.124Z」

相關問題