Преобразовать строку в дату - проверка даты - PullRequest
0 голосов
/ 19 декабря 2011

Я получаю исключение нулевого указателя, когда пользователь вводит дату в неправильном формате.

Метод преобразования строки в дату

 Date stringToDate(String dateString) {

        Date returnDate = null;
        if (dateString!= null && dateString.length() > 0 && isValidDate(dateString)) {
            returnDate = dateFormat.parse(dateStr);
        }
        return returnDate;
    }

и

boolean isValidDate(String date) {
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");  
    Pattern datePattern = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{4}");
    Matcher datePatternMatch = datePattern.matcher(date);

    boolean datePatternMatchfound = datePatternMatch.matches();

    if(date==null){
        return false;
    } else if(date!=null && date.length()>0){       
        if(datePatternMatchfound){
            sdf.setLenient(false);
            sdf.parse(date.trim());
        }
        return true;
    } else {
        return false;
    }  
}

Мне просто интересно узнать ....

1) Каким должен быть действительный шаблон для даты?

2) если пользователь введет неправильную дату, метод stringToDate обязательно потерпит неудачу и выдаст исключение нулевого указателя. Как этого избежать?

Любая помощь будет принята с благодарностью.

Ответы [ 5 ]

2 голосов
/ 19 декабря 2011

вы предполагаете, что SimpleDateFormat (MM-dd-гггг - шаблон по умолчанию, который будет вводить пользователь, либо вы должны убедиться, что ваш пользователь может входить только в SimpleDateFormat, либо вы должны внести изменения в isValidDate (), чтобы принять

1 голос
/ 19 декабря 2011

Одна вещь состоит в том, что вам нужно быть более защищенным в своем методе проверки.

В показанном вами коде вы делаете это:

Matcher datePatternMatch = datePattern.matcher(date);

, прежде чем проверять, является ли датаСтрока пуста.Pattern.matcher(null) приводит к NullPointerException.

Так что вам нужно переместить этот код в ваш if (date != null) условный блок.

Кроме этого, я не вижу преимущества в проверке даты Stringс регулярным выражением перед проверкой его с помощью DateFormat.Проверка регулярного выражения не дает вам никаких дополнительных преимуществ.

1 голос
/ 19 декабря 2011

Правильный формат представления даты полностью зависит от вашего приложения и локали пользователя.Однако вы можете ограничить формат ввода определенным форматом и использовать его для анализа и форматирования ввода даты.

Вы можете поймать ParseException, брошенный методом parse, и обработать недопустимые случаи в предложении catch.

Например, ваш код можно упростить до следующего:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

Date stringToDate(String dateString) {
  try {
    Date returnDate = sdf.parse(dateString);
    // do something with returnDate, if necessary
    return returnDate;
  } catch(ParseException e) {
    // Date is not valid, handle invalid cases here..
    return null; // Not a good practice, you probably would throw an Exception
  }
}

И вы можете использовать тот же форматер для отображения ваших значений в пользовательском интерфейсе, вызвав метод sdf.format(someDate) и получивСтроковое представление.

0 голосов
/ 03 апреля 2014

Используя класс Simple date format, мы можем проверить, является ли string датой или нет.Необходимо убедиться, что для setLenient (false) установлено значение simple date format.

Если он не задан, возникает проблема с округлением значений. Например, снисходительный GregorianCalendar интерпретирует MONTH == JANUARY., DAY_OF_MONTH == 32 как 1 февраля.

Пример кода:

http://www.vijayakumarg.co.in/2014/04/how-to-validate-date-string-in-java.html

public static boolean validateJavaDate(String strDate)
{

    /*
     * Set preferred date format,
     * For example MM-dd-yyyy, MM.dd.yyyy,dd.MM.yyyy etc.*/
    SimpleDateFormat sdfrmt = new SimpleDateFormat("MM/dd/yyyy");
    sdfrmt.setLenient(false);
    /* Create Date object */
    Date javaDate = null;
    /* parse the string into date form */
    try
    {
        javaDate = sdfrmt.parse(strDate);
        System.out.println("Date after validation: " + javaDate);
    }
    /* Date format is invalid */
    catch (ParseException e)
    {
       System.out.println("The date you provided is in an " +"invalid date format.");
       return false;
    }
    /* Return 'true' - since date is in valid format */
    return true;

}
0 голосов
/ 19 декабря 2011
  1. Допустимый формат шаблона зависит, например, от настройки системы страны.

  2. Вы должны поместить содержимое метода isValidDate() в попытку.блок catch, чтобы избежать исключения.

...