Saturday, November 9, 2013

Coding - A generic String to Date parse utility


A generic Date utility that accepts date in ymd or dmy format. 
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DateUtils {
 private static final Pattern ymd = Pattern
 .compile("^(\\d{4})-([1-9]|[0][1-9]|1[0-2])
              -([1-9]|0[1-9]|[12][0-9]|[3][01])$");
 private static final Pattern dmy = Pattern
 .compile("^([1-9]|[0][1-9]|1[0-2])
              -([1-9]|0[1-9]|[12][0-9]|[3][01])-(\\d{4})$");
 private static final DateFormat df = new SimpleDateFormat(
                                                  "yyyy-MM-dd");
 
 static {
 //prevents using "2001-02-29" for March 1st
 df.setLenient(false);
 }
 
 private static Date parse(String value) {
  if (value == null) {
 return null;
  }
 
 String input = value.trim().replaceAll("[\\./ ]", "-");
 if (input.length() < 8) {
  return null;
 }
 
 String ds = null;
 Matcher matcher = ymd.matcher(input);
 
 if (matcher.find()) {
  ds = matcher.group(1) + "-" + matcher.group(2) + "-"
   + matcher.group(3);
 } else {
  matcher = dmy.matcher(input);
  if (matcher.find()) {
   ds = matcher.group(3) + "-" + matcher.group(1) + "-"
    + matcher.group(2);
  }
 }

 Date result = null;
 if (ds == null) {
 // user's inputer does not match an expected format
 } else {
 try {
  result = df.parse(ds);
} catch (ParseException e1) {
 // should not happen, but treat it the same as invalid input
 // there is no need to log
 }
}

 return result;
}

public static void main(String[] args) {
 String[] inputs = { "2016-9-8", "2016-09-8", "2016-09-08", "2016-9-08",
  "9-8-2016", "09-8-2016", "09-08-2016", "9-08-2016", "9/8/2016",
  " 9-8-2016", " 2016-9-8", "9-8-2016 ", "2016-9-8 ",
  "2016 9 8 ",
  null, "13-1-9999", "1-33-9999", "9999-13-1", "9999-1-33" };

 for (String input : inputs) {
 System.err.println(input + "\t" + parse(input));
 }
}

}


No comments:

Post a Comment