[英]How to test parsing a date with SimpleDateFormat without ParseException
我通過傳遞特定模式來解析Android類java.text.SimpleDateFormat
的日期。 但是我使用多個數據源並且可以有兩種不同的日期模式,有時日期中沒有星期幾,即我希望運行兩個代碼中的任何一個:
new SimpleDateFormat("EEE dd MMM yyyy", Locale.US).parse(myDate);
new SimpleDateFormat("dd MMM yyyy", Locale.US).parse(myDate);
但是我沒有找到任何方法來區分這兩個案例而不是String myDate
的值。
到目前為止,我可以運行兩行代碼中的一行並捕獲ParseException
以防我運行錯誤的(並且我在catch塊中運行另一行)。 我的第二個選擇是使用String.matches(String)
或操作Pattern
進行一些先前的分析。
因為不必要地拋出異常是一種不好的做法,在通過實現Date解析工具重新發明輪子之前,是否有任何其他類或庫可以讓我測試一個模式(理想情況下會返回SimpleDateFormat.isParseable(String)
如果SimpleDateFormat.parse(String)
拋出ParseException,則返回false。
到目前為止,我在SimpleDateFormat方法和它的父母之間進行了搜索,但我找不到任何提示或任何人在這樣的問題中運行。
這是當前的代碼:
Date parseDate(String myDate){
String expectedDate = "";
try{
expectedDate = new SimpleDateFormat("EEE dd MMM yyyy", Locale.US).parse(myDate);
// this is the first possible pattern for the date
} catch(ParseException e){ // I consider it bad practice and too expensive to run code there
expectedDate = new SimpleDateFormat("dd MMM yyyy", Locale.US).parse(myDate);
// this is the second possible pattern for the date
}
return expectedDate;
}
而且,正如我在評論中添加的那樣,我注意到了這個問題,因為我根據日期訂購了ListView
顯示的項目列表,我可以注意到性能方面的差異。
根據對該問題的評論,您已經確定了使用SimpleDateFormat
的性能問題。
如果它是每種格式的50/50分割,您可以嘗試使用正則表達式進行預處理。
SimpleDateFormat shortFormat = new SimpleDateFormat( "dd MMM yyyy" );
SimpleDateFormat longFormat = new SimpleDateFormat( "EEE dd MMM yyyy" );
String input = ""; // from somewhere
Pattern shortFormatPattern = Pattern.compile( "[0-9]{2}\\s\p{Alpha}{3}\\s[0-9]{4}" );
Date date;
if( shortFormatPattern .matcher( input ).matches() )
{
date = shortFormat.parse( input );
}
else
{
date = longFormat.parse( input );
}
如果您輸入的很大一部分是一種格式,您可以確保首先嘗試解析該格式(因為大多數情況下,不會拋出異常)。
您可以通過使用正則表達式來實現這一點,或者,如果您想保持簡單並且您知道這些是您將接收此數據的唯一2種格式,您可以始終只使用簡單的拆分:
int parts = myDate.split(' ').length;
if ( parts == 3 ) {
// short format
}
else if ( parts == 4 ) {
// long format
}
如果您只是想快速而骯臟的方式來完成它,這將是有效的。 這遠非理想,如果您將來可能添加更多格式,則不應使用它。 理想情況下,您可以在.properties文件中將日期格式模式及其正則表達式模式存儲在外部,而不是對其進行硬編碼,以便將來可以在不重建的情況下對其進行擴展。
不確定這是否是您正在尋找的。 我在下面提供了一個示例來解析2種格式之間的日期信息。
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
java.util.Date date = null;
try
{
date = format1.parse("2011-03-27T09:39:01.607");
}
catch (ParseException e)
{
e.printStackTrace();
}
SimpleDateFormat format2 = new SimpleDateFormat("MMMMM dd, yyyy");
String newDateStr = format2.format(date);
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.