使用SimpleDateFormat.parse(String)
要求格式中指定的所有字段都存在於輸入字符串中。我想要的是用相同的格式驗證部分輸入字符串的方法。Java解析部分日期
例如,Format="yyyy/MM/dd HH:mm:ss"
和Input="2012/01/01"
應該匹配,並且一天中的時間應設置爲零。
有沒有辦法做到這一點?目前,SimpleDateFormat
引發異常。
使用SimpleDateFormat.parse(String)
要求格式中指定的所有字段都存在於輸入字符串中。我想要的是用相同的格式驗證部分輸入字符串的方法。Java解析部分日期
例如,Format="yyyy/MM/dd HH:mm:ss"
和Input="2012/01/01"
應該匹配,並且一天中的時間應設置爲零。
有沒有辦法做到這一點?目前,SimpleDateFormat
引發異常。
使用2個不同的SimpleDateFormat
對象,每個對象具有不同的日期格式,並使用第一個。如果引發解析異常,請使用另一個。
最佳解決方案恕我直言,你首先使用正則表達式檢查字符串,以便知道使用哪種解析格式。也可能你想在正則表達式中使用分組並自己形成日期(例如使用Calendar
),而不是至少兩次解析字符串(一個是正則表達式,其次是DateFormat
)。
我更喜歡正則表達式。也想到了例外情況,但試圖想到一個不依賴於例外的乾淨解決方案。 – Windle
嘗試Apache Utils的DateUtils#parseDate(String, String[])
。 它可以讓你傳遞一個允許的格式數組,並會嘗試每一個,直到適合。
這裏是落實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);
}
'SimpleDateFormat'不是'final'類,你可以擴展它(或可能'DateFormat')。我相當肯定,沒有建立在這種方式下的行爲;你將自己寫下差異。儘管如果某人只提供'01',會發生什麼情況 - 他們的意思是1月份,(假定當前)月份的第一天,1:00:00還是其他什麼?格式化程序基本上提供了有關如何解釋字符串的說明... –
另一種方法是從fullformat開始,然後使用substring()刪除最後一個字符並創建新格式,直到找到格式火柴。那種殘酷,但非常有效。 –