Java: проблема проверки даты григорианского календаря - PullRequest
2 голосов
/ 04 октября 2011

Я пытаюсь проверить дату, введенную пользователем с помощью григорианского календаря в java (это обязательно), однако всякий раз, когда я проверяю дату в декабре, появляется сообщение об ошибке ниже.

Exception in thread "main" java.lang.IllegalArgumentException: MONTH   
        at java.util.GregorianCalendar.computeTime(Unknown Source)  
        at java.util.Calendar.updateTime(Unknown Source)  
        at java.util.Calendar.getTimeInMillis(Unknown Source)  
        at java.util.Calendar.getTime(Unknown Source)

код ниже

public static boolean  ValidDate (int Day, int Month, int Year)  
    GregorianCalendar Date = new GregorianCalendar();  
    Date.setLenient(false);  
    Date.set(Year, Month, Day, 0, 0, 0);  
    try{  
        Date.getTime();  
        return true;  
        }catch (Exception e){  
            System.out.println("Date is invalid please try again");   
            return false;  
        }  
}

Мне не удалось найти что-либо релевантное в Google, поэтому любая помощь была бы потрясающей!

Ответы [ 3 ]

9 голосов
/ 04 октября 2011

В классе Calendar, хотя дни и годы имеют нумерацию 1..n (на основе одного), месяцы нумеруются 0-11 (на основе нуля), поэтому декабрь равен , а не номер месяца 12, это номер месяца 11.

Попробуйте вызвать метод, указав 11 (вместо 12) для параметра месяца.

Эта проблема - всего лишь один из многих запаздывающих аспектов класса Calendar.

3 голосов
/ 04 октября 2011

Или, еще лучше, используйте константу Calendar.DECEMBER.Вам не нужно беспокоиться о том, что под одеялом 11 или 12.

Сделайте себе одолжение: изучите и соблюдайте стандарты кодирования Java.Я бы написал так:

public static boolean  isvalidDate (int day, int month, int year)  
    Calendar calendar = Calendar.getInstance();
    calendar.setLenient(false);  
    calendar.set(year, month, day, 0, 0, 0);  
    try {  
        date.getTime();  
        return true;  
     } catch (Exception e) {  
        return false;  
     }  
 }
0 голосов
/ 31 октября 2017

ТЛ; др

LocalDate.of( year , month , dayOfMonth )  // Catch exception `DateTimeParseException`

java.time

Современный подход использует классы java.time, а не проблемный старый класс GregorianCalendar.

Класс java.time.LocalDate представляет значение только для даты без времени суток и без часового пояса.

Чтобы проверить ваши входные данные, попробуйте собрать LocalDate из чисел. В отличие от GregorianCalendar, LocalDate имеет вменяемую нумерацию месяцев, 1-12 за январь-декабрь. Если числа приводят к неправильной дате, выдается DateTimeParseException, чтобы вы могли поймать.

try {
    LocalDate ld = LocalDate.of( year , month , dayOfMonth ) ;
    return true ;  // true = Valid data entered for a date.
} catch ( DateTimeParseException e ) {
    return false;  // Exception caught, meaning invalid data-entry.
}

О java.time

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

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

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

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

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

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