2014-11-03 18 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