簡體   English   中英

如何在沒有ParseException的情況下使用SimpleDateFormat測試日期解析

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM