2013-04-20 60 views
0

我想創建一些可以檢查多種格式的日期/時間來查看它是否有效的日期/時間,以便我可以處理它。處理它包括將日期/時間轉換爲我的軟件可以使用的標準化日期/時間。問題是,我將不得不用不同的方式進行檢查,以便使用SimpleDateFormat檢測日期,但確實很難獲得各種各樣的信息。該項目涉及在日期列中解析具有潛在用戶指定日期格式的CSV文件。有沒有更好的辦法?以下是我現在在做什麼:Java處理多個可能未知的日期/時間格式

public static boolean isDateValid(String dateString) 
{ 
    ArrayList<SimpleDateFormat> dateFormats = new ArrayList<SimpleDateFormat>(); 

    dateFormats.add(new SimpleDateFormat("M/dd/yyyy")); 
    dateFormats.add(new SimpleDateFormat("dd.M.yyyy")); 
    dateFormats.add(new SimpleDateFormat("M/dd/yyyy hh:mm:ss")); 
    dateFormats.add(new SimpleDateFormat("dd.M.yyyy hh:mm:ss")); 
    dateFormats.add(new SimpleDateFormat("dd-M-yyyy hh:mm:ss")); 
    dateFormats.add(new SimpleDateFormat("M-dd-yyyy hh:mm:ss")); 
    dateFormats.add(new SimpleDateFormat("yyyy-M-dd hh:mm:ss")); 
    dateFormats.add(new SimpleDateFormat("dd.MMM.yyyy")); 
    dateFormats.add(new SimpleDateFormat("dd-MMM-yyyy")); 
    dateFormats.add(new SimpleDateFormat("M/dd")); 
    dateFormats.add(new SimpleDateFormat("M dd")); 
    dateFormats.add(new SimpleDateFormat("M y")); 
    for (SimpleDateFormat format : dateFormats) 
    { 
     try 
     { 
      format.setLenient(false); 
      Date date = format.parse(dateString); 
      return true; 
     } 
     catch (Exception e) 
     { 

     } 
    } 
    return false; 
} 

另外我一直在使用DateUtils從Apache的百科全書也嘗試過,但似乎我還是會通過一串日期必須循環。

public static boolean isDate(String dateString) 
{ 
    try 
    { 
     Date theDate = DateUtils.parseDate(dateString); 
    } 
    catch (Exception e) 
    { 
     System.out.println(e); 
     return false; 
    } 
    return true; 
} 

任何想法或鼓勵的話?

+0

你是什麼意思,「但似乎我仍然需要循環一堆日期。」 ? – 2013-04-20 01:33:34

+0

對不起,我的意思是,我將不得不循環可能的格式仍然傳入日期。 – 2013-04-20 01:37:54

回答

0

當前方法的一個問題是,當您知道只打算使用SimpleDateFormat時,您不必要地創建所有SimpleDateFormat實例。相反,使用正則表達式來檢測您正在接收的日期字符串類型,然後執行以下兩項操作之一:1)僅實例化所需的格式化程序,或2)將字符串操作爲標準格式,您可以用一個常見格式化程序。

0

嗯,這裏是我的建議:

  1. 您應該縮小類型支持的日期format.It的 creazy的支持每一種數據格式,例如,一九九零年三月一日 是中文有效的日期格式。

  2. 我們有一個雙重檢查的方法檢測到有效日期 如下:

    public boolean isDate(String dateStr, DateFormat format){ 
        boolean result = false; 
        try 
        { 
         Date date = format.parse(dateStr); 
         if (format.format(date).equals(dateStr)) 
         { 
          result = true; 
         } 
        } catch (Exception e) 
        { 
         result = false; 
        } 
        return result; 
    } 
    

,因爲「2013年4月31日」是tranlate爲「2013年5月1日」通過SimpleDateFormat,4月的最後一天是30日,對嗎?

0

我在工作中被分配了一個類似的問題,我參與了ETL過程以將數據從源文件加載到倉庫。日期格式因供應商不同而不同。 我的解決方案與列出的循環示例一致。有一個選項可以使用parsePosition而不是循環。 但是,有一些方法可以使循環代碼更好,而不是再次實例化SimpleDateFormat(已發佈)。相反,只需使用applyPattern。另外,將各種格式保存在一個平面文件(config)中會使配置和適應新格式更好。 我已在以下link上發佈我的實施。這可能有一些幫助。

+0

人們會很快遇到的問題是日期格式不明確。即使只使用普通的西方格式,純粹的數字形式也可能根據具體的日期在月份和日期之間變得模糊不清。這只是一個棘手的問題!如果有什麼方法可以將需求推回到數據流中去選擇並粘貼日期格式,請執行以下操作:-) – 2015-12-17 14:57:32

+1

Hi Ron,同意修復事件源是理想的,但有時候考慮到倉庫會有源各種各樣的記錄系統有自己的理由不要做任何改變。因此,人們必須努力在最後達到最佳狀態。 – Allzhere 2015-12-19 14:40:13