2014-11-03 37 views
3

我想使用DateUtils.parseDate解析具有不同潛在格式的日期。它似乎使用第一個解析器,即使它應該檢測到23/10/20142014/10/23之間的差異。apache DateUtils:解析具有多種模式的日期

它實際上解析日期,即使它是錯誤的,以至於我甚至無法捕捉到異常。我能怎麼做?這是一個錯誤嗎? (公地lang3-3.3.2)

下面的代碼片段

package snippet; 

import java.text.ParseException; 
import java.util.Date; 

import org.apache.commons.lang3.time.DateUtils; 

public class TestDateFormat { 

    public static void main(String[] args) throws ParseException { 

     Date d = DateUtils.parseDate("23/10/2014T12:34:22", 
      new String[] {"yyyy/MM/dd'T'HH:mm:ss", 
       "dd/MM/yyyy'T'HH:mm:ss"}); 

     System.out.println(d); 
     //returns Tue Apr 05 12:34:22 CET 29 which is wrong 
    } 

} 

回答

3

你應該使用DateUtils.parseDateStrictly

DateUtils#parseDateStrictly

解析試圖通過一個代表日期的字符串各種不同的 解析器。

解析將依次嘗試每個解析模式。如果分析整個輸入字符串,解析僅被視爲 成功。如果沒有解析 模式匹配,則拋出ParseException。

解析器嚴格解析 - 它不允許諸如 「1996年2月942」之類的日期。

在內部,它的作用是設定爲false使用的DateFormatlenient屬性:DateFormat.html#setLenient

指定日期/時間分析是否是寬鬆的。通過 從寬分析,解析器可以使用啓發式來解釋不精確匹配此對象格式的輸入 。通過嚴格的解析, 輸入必須匹配此對象的格式。

例子:

public static void main(String[] args) throws ParseException { 
     Date d = DateUtils.parseDateStrictly("23/10/2014T12:34:22", 
      new String[] {"yyyy/MM/dd'T'HH:mm:ss", 
       "dd/MM/yyyy'T'HH:mm:ss"}); 

     System.out.println(d); 
    } 
+0

完美!現在還不清楚,現在是 – 2014-11-03 14:54:33

+0

不客氣! – 2014-11-03 15:21:07

+0

parseDateStrictly()不解析格式「MM/dd/yyyy:hh:mm:ss」的任何原因。儘管parseDate()適用於格式「MM/dd/yyyy:hh:mm:ss」。 – b22 2016-08-30 17:03:16