Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

apache DateUtils: parsing a date with multiple patterns

I want to parse a date that has different potential formats using DateUtils.parseDate. It seems to use the first parser, even if it should detect the difference between 23/10/2014 and 2014/10/23.

It actually parses the date even if it is wrong, so that I can't even catch an exception. How can I do? Is it a bug? (commons-lang3-3.3.2)

Here is a code snippet

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
    }

}
like image 253
dao hodac Avatar asked Nov 03 '14 11:11

dao hodac


1 Answers

You should use DateUtils.parseDateStrictly:

DateUtils#parseDateStrictly

Parses a string representing a date by trying a variety of different parsers.

The parse will try each parse pattern in turn. A parse is only deemed successful if it parses the whole of the input string. If no parse patterns match, a ParseException is thrown.

The parser parses strictly - it does not allow for dates such as "February 942, 1996".

Internally, what it does is setting to false the lenient attribute of the DateFormat used: DateFormat.html#setLenient

Specify whether or not date/time parsing is to be lenient. With lenient parsing, the parser may use heuristics to interpret inputs that do not precisely match this object's format. With strict parsing, inputs must match this object's format.

Example:

   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);
  }
like image 117
Tobías Avatar answered Nov 05 '22 05:11

Tobías