Как проверить правильность Date String? - PullRequest
0 голосов
/ 25 октября 2010

В моем проекте мне нужно проверить, соответствует ли строка даты правильному объекту Date.Я решил разрешить yyyy-MM-dd и форматы даты [(год, месяц, дата) и (год, месяц, дата, часы, минуты)].Как я могу проверить, если они действительны?Мой код возвращает ноль для "1980-01-01" и некоторые странные даты (например, 3837.05.01), которые дают строку, разделенную запятыми:

private Date parseDate(String date){
    Date data = null;

    // yyy-mm-dd
    try {
        DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
        df.setLenient(false);
        df.parse(date);
        return data;
    }
    catch (Exception e) {
        try{
            int[] datArr = parseStringForDate(date);
            int len = datArr.length;
            // year, month, day
            if(len == 3){
                return new Date(datArr[0], datArr[1], datArr[2]);
            }
            // year, montd, day, hours, mins
            else if(len ==5){
                return new Date(datArr[0], datArr[1], datArr[2], datArr[3], datArr[4]);
            }
            // year, month, day, hours, mins, secs
            else if(len == 6){
                return new Date(datArr[0], datArr[1], datArr[2], datArr[3], datArr[4], datArr[5]);
            }
            else {
                return data;
            }
        }
        catch (Exception f){
            return data;
        }
    }
}

private int[] parseStringForDate(String s){
    String[] sArr = s.split(",");
    int[] dateArr = new int[sArr.length];

    for(int i=0; i< dateArr.length; i++){
        dateArr[i] = Integer.parseInt(sArr[i]);
    }

    return dateArr;
}

Я помню, что мне пришлось вычесть 1900 из года, но я также вижу, что месяц отличается и т. д., и я хотел бы избежать проверки каждого элемента моего массива целых из строки даты.Можно ли автоматически анализировать их в объекте «Календарь» или «Дата»?

Ответы [ 4 ]

7 голосов
/ 25 октября 2010

Вы можете создать SimpleDateFormat объекты для различных форматов строк, например, (возвращая null, если параметр не может быть проанализирован как действительная дата):

// Initializing possibleFormats somewhere only once
SimpleDateFormat[] possibleFormats = new SimpleDateFormat[] {
  new SimpleDateFormat("yyyy-MM-dd"),
  new SimpleDateFormat("yyyy,MM,dd"),
  new SimpleDateFormat("yyyy,MM,dd,HH,mm") };
for (SimpleDateFormat format: possibleFormats)
{
  format.setLenient(false);
}
// initializing ends

public Date parseDate(String date) {
  Date retVal = null;
  int index = 0;
  while (retVal == null && index < possibleFormats.length) {
    try {
      retVal = possibleFormats[index++].parse(date);
    } catch (ParseException ex) { /* Do nothing */ }
  }
  return retVal;
}
1 голос
/ 29 апреля 2017

Для тех, кто заходил в 2017 году или позже, вот решение Java 8:

private static DateTimeFormatter[] possibleFormats = {
    DateTimeFormatter.ofPattern("uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT),
    DateTimeFormatter.ofPattern("uuuu,MM,dd").withResolverStyle(ResolverStyle.STRICT),
    DateTimeFormatter.ofPattern("uuuu,MM,dd,HH,mm").withResolverStyle(ResolverStyle.STRICT),
    DateTimeFormatter.ofPattern("uuuu,MM,dd,HH,mm,ss").withResolverStyle(ResolverStyle.STRICT)
};

public Optional<LocalDate> parseDate(String date) {
    for (DateTimeFormatter format : possibleFormats) {
        try {
            LocalDate result = LocalDate.parse(date, format);
            return Optional.of(result);
        } catch (DateTimeParseException dtpe) {
            // ignore, try next format
        }
    }
    return Optional.empty();
}

С DateTimeFormatter вы можете безопасно позволить массиву форматеров быть статическими даже в многопоточной среде: в отличие от SimpleDateFormat, DateTimeFormatter является поточно-ориентированным.

A LocalDate - это дата без времени, поэтому, если в строке присутствуют часы и минуты, они теряются. Чтобы получить часы, минуты и секунды, вам также понадобится LocalDateTime, а затем вам понадобятся некоторые хитрости, чтобы сделать синтаксический анализ в тех случаях, когда в строке нет часов и минут. Вы можете либо попробовать LocalDate.parse() и LocalDateTime.parse(), либо создать форматтер, который по умолчанию используется часами, когда его нет в строке. DateTimeFormatterBuilder может сделать это.

1 голос
/ 25 октября 2010

Вы делаете это неправильно.Вы должны использовать SimpleDateFormat .

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
    Date test = sdf.parse(input);
} catch (ParseException pe) {
   //Date is invalid, try next format
}
0 голосов
/ 25 октября 2010

Просто чтобы показать окончательный результат, благодаря Csaba_H и Стиву Куо.

private Date parseDate(String date){

    SimpleDateFormat[] possibleFormats = new SimpleDateFormat[] {
        new SimpleDateFormat("yyyy-MM-dd"),
        new SimpleDateFormat("yyyy,MM,dd"),
        new SimpleDateFormat("yyyy,MM,dd,HH,mm") };

    Date retVal = null;
    for (SimpleDateFormat f: possibleFormats) {
        f.setLenient(false);
        try {
            retVal = f.parse(date);
        } catch (ParseException e) {}
    }
    return retVal;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...