Проверка даты Java - PullRequest
       6

Проверка даты Java

6 голосов
/ 07 сентября 2011

Мне нужно подтвердить ввод пользователя в качестве действительной даты.Пользователь может ввести дд / мм / гггг или мм / гггг (оба действительны)

, чтобы подтвердить это, я делал

try{
    GregorianCalendar cal = new GregorianCalendar(); 
    cal.setLenient(false);  
    String []userDate = uDate.split("/");
    if(userDate.length == 3){
        cal.set(Calendar.YEAR, Integer.parseInt(userDate[2]));  
        cal.set(Calendar.MONTH, Integer.parseInt(userDate[1]));  
        cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(userDate[0]));
        cal.getTime(); 
    }else if(userDate.length == 2){
        cal.set(Calendar.YEAR, Integer.parseInt(userDate[1]));  
        cal.set(Calendar.MONTH, Integer.parseInt(userDate[0]));  
        cal.getTime(); 
    }else{
            // invalid date
    }
}catch(Exception e){
    //Invalid date
}

как месяц начала GregorianCalendar с 0, 30/01/2009или 12/2009 выдает ошибку.

любое предложение, как решить эту проблему.

Ответы [ 3 ]

11 голосов
/ 07 сентября 2011

Используйте SimpleDateformat.Если при синтаксическом анализе происходит сбой ParseException:

private Date getDate(String text) throws java.text.ParseException {

    try {
        // try the day format first
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        df.setLenient(false);

        return df.parse(text);
    } catch (ParseException e) {

        // fall back on the month format
        SimpleDateFormat df = new SimpleDateFormat("MM/yyyy");
        df.setLenient(false);

        return df.parse(text);
    }
}
3 голосов
/ 07 сентября 2011

Используйте SimpleDateFormat для подтверждения Date и setLenient до false.

1 голос
/ 04 июня 2018

tl; др

Используйте try - catch для захвата DateTimeParseException, брошенного из LocalDate.parse и YearMonth.parse в классах java.time .

java.time

В современном подходе используются классы java.time .

YearMonth

Только для года-месяца без дня месяца используйте класс YearMonth.

Если возможно, пусть ваши пользователи используют стандартный ISO 8601 формат для ввода данных: YYYY-MM.Классы java.time по умолчанию используют стандартные форматы при разборе / генерации строк.

YearMonth ym = YearMonth.parse( "2018-01" ) ;

Если это невозможно, укажите шаблон форматирования.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/uuuu" ) ;
YearMonth ym = YearMonth.parse( "01/2018" , f ) ;

Для проверки на недопустимый ввод ловушку для исключения.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/uuuu" ) ;
YearMonth ym = null ;
try{
    ym = YearMonth.parse( "01/2018" , f ) ;
} catch ( DateTimeParseException e ) {
    // Handle faulty input
    …
}

LocalDate

Для значения только на дату, без времени-день и без часового пояса, используйте LocalDate класс.

Опять же, используйте стандартный формат ISO 8601 для ввода данных, если это возможно: YYYY-MM-DD.

LocalDate ld = LocalDate.parse( "2018-01-23" ) ;

Если нет, укажите шаблон форматирования и ловушку для исключения, как показано выше.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate ld = null ;
try{
    ld = LocalDate.parse( "23/01/2018" , f ) ;
} catch ( DateTimeParseException e ) {
    // Handle faulty input
    …
}

Объединение

Если ввод может быть только датойили год-месяц, затем проверьте длину ввода, чтобы определить, какой из которых.

int length = input.length() ;
switch ( length ) {
    case 7 :
        …  // Process as year-month using code seen above.

    case 10 :
        …  // Process as date-only using code seen above.

    default: 
        …  // ERROR, unexpected input.
}

О java.time

java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...