2012-06-21 179 views
2

使用SimpleDateFormat.parse(String)要求格式中指定的所有字段都存在於輸入字符串中。我想要的是用相同的格式驗證部分輸入字符串的方法。Java解析部分日期

例如,Format="yyyy/MM/dd HH:mm:ss"Input="2012/01/01"應該匹配,並且一天中的時間應設置爲零。

有沒有辦法做到這一點?目前,SimpleDateFormat引發異常。

+0

'SimpleDateFormat'不是'final'類,你可以擴展它(或可能'DateFormat')。我相當肯定,沒有建立在這種方式下的行爲;你將自己寫下差異。儘管如果某人只提供'01',會發生什麼情況 - 他們的意思是1月份,(假定當前)月份的第一天,1:00:00還是其他什麼?格式化程序基本上提供了有關如何解釋字符串的說明... –

+0

另一種方法是從fullformat開始,然後使用substring()刪除最後一個字符並創建新格式,直到找到格式火柴。那種殘酷,但非常有效。 –

回答

2

使用2個不同的SimpleDateFormat對象,每個對象具有不同的日期格式,並使用第一個。如果引發解析異常,請使用另一個。

最佳解決方案恕我直言,你首先使用正則表達式檢查字符串,以便知道使用哪種解析格式。也可能你想在正則表達式中使用分組並自己形成日期(例如使用Calendar),而不是至少兩次解析字符串(一個是正則表達式,其次是DateFormat)。

+1

我更喜歡正則表達式。也想到了例外情況,但試圖想到一個不依賴於例外的乾淨解決方案。 – Windle

0

這裏是落實m0skit0提出的解決方案的方式,使用多個SimpleDateFormat可以級聯與嘗試捕捉的解析,對於如:

SimpleDateFormat fullFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
SimpleDateFormat shortFormat = new SimpleDateFormat("yyyy/MM/dd"); 

String input="2012/01/01"; 
Date res; 
try { 
    res = fullFormat.parse(input); 
} catch (ParseException e) { 
    res = shortFormat.parse(input); 
} 
+1

將複製粘貼問題與您的'shortFormat' =) – Windle

+0

我已在15分鐘前提供此答案。在回答之前請閱讀現有答案。 – m0skit0

+0

Thx to @Windle,我改正了。 ;) – Nicocube