apache DateUtils:解析具有多个模式的日期

dao*_*dac 4 java parsing date apache-commons

我想解析具有不同潜在格式的日期DateUtils.parseDate.看来使用第一语法分析器,即使它应该检测之间的差异23/10/20142014/10/23.

它实际上解析了日期,即使它是错误的,所以我甚至无法捕获异常.我能怎么做?这是一个错误吗?(公地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
    }

}
Run Code Online (Sandbox Code Playgroud)

Tob*_*ías 7

你应该使用DateUtils.parseDateStrictly:

DateUtils#parseDateStrictly

通过尝试各种不同的解析器来解析表示日期的字符串.

解析将依次尝试每个解析模式.如果解析整个输入字符串,则认为解析成功.如果没有解析模式匹配,则抛出ParseException.

解析器严格解析 - 它不允许诸如"February 942,1996"之类的日期.

在内部,它所做的是设置使用falselenient属性DateFormat: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);
  }
Run Code Online (Sandbox Code Playgroud)