Определите, является ли String действительной датой перед анализом - PullRequest
13 голосов
/ 08 июня 2009

У меня такая ситуация, когда я читаю около 130 тыс. Записей, содержащих даты, хранящиеся в виде строковых полей. Некоторые записи содержат пробелы (нули), некоторые содержат строки вроде этого: 'dd-MMM-yy', а некоторые содержат это 'dd / MM / yyyy'.

Я написал такой метод:

public Date parsedate(String date){

   if(date !== null){
      try{
        1. create a SimpleDateFormat object using 'dd-MMM-yy' as the pattern
        2. parse the date
        3. return the parsed date
      }catch(ParseException e){
          try{
              1. create a SimpleDateFormat object using 'dd/MM/yyy' as the pattern
              2. parse the date
              3. return parsed date
           }catch(ParseException e){
              return null
           }
      }
   }else{
      return null
   }

} 

Так что вы, возможно, уже заметили проблему. Я использую попытку .. поймать как часть моей логики . Было бы лучше, если бы я мог заранее определить, что строка действительно содержит анализируемую дату в каком-либо формате, а затем попытаться ее проанализировать.

Итак, есть ли какой-нибудь API или библиотека, которая может помочь с этим? Я не против написать несколько разных классов Parse для обработки разных форматов, а затем создать фабрику для выбора правильного6, но как мне определить, какой именно?

Спасибо.

Ответы [ 11 ]

1 голос
/ 19 апреля 2012

Простой служебный класс, который я написал для своего проекта. Надеюсь, это кому-нибудь поможет.

Примеры использования:

DateUtils.multiParse("1-12-12");
DateUtils.multiParse("2-24-2012");
DateUtils.multiParse("3/5/2012");
DateUtils.multiParse("2/16/12");




public class DateUtils {

    private static List<SimpleDateFormat> dateFormats = new ArrayList<SimpleDateFormat>();



    private Utils() {
        dateFormats.add(new SimpleDateFormat("MM/dd/yy")); // must precede yyyy
        dateFormats.add(new SimpleDateFormat("MM/dd/yyyy"));
        dateFormats.add(new SimpleDateFormat("MM-dd-yy"));
        dateFormats.add(new SimpleDateFormat("MM-dd-yyyy"));            

    }
        private static Date tryToParse(String input, SimpleDateFormat format) {
        Date date  = null;
        try {
            date = format.parse(input);
        } catch (ParseException e) {

        }

        return date;
    }

        public static Date multiParse(String input)  {
        Date date = null;
        for (SimpleDateFormat format : dateFormats) {
            date = tryToParse(input, format);
            if (date != null) break;
        }
        return date;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...