Java - GregorianCalendar - PullRequest
       36

Java - GregorianCalendar

1 голос
/ 17 марта 2012

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

Я создал объект GregorianCalendar и передал ему значения данных, которые я хотел бы проверить следующим образом:

GregorianCalendar cal1 = new GregorianCalendar(day,month,year);

Еслидата действительна, я хотел бы вернуть истину.Как я мог это сделать?

Ответы [ 3 ]

3 голосов
/ 17 марта 2012

Основная идея: если вы попытаетесь установить недопустимую дату для экземпляра Календаря, она сделает ее правильной,

Например, если вы установили 45 в качестве даты, она не будет прежней, если вы установите и получите

public boolean isValid(int d, int m, int y){
    //since month is 0 based
    m--;
    //initilizes the calendar instance, by default the current date
    Calendar cal = Calendar.getInstance();
    //resetting the date to the one passed
    cal.set(Calendar.YEAR, y);
    cal.set(Calendar.MONTH, m);
    cal.set(Calendar.DATE, d);

    //now check if it is the same as we set then its valid, not otherwise
    if(cal.get(Calendar.DATE)==d &&cal.get(Calendar.MONTH) ==m && cal.get(Calendar.YEAR) ==y){
      return true;
    }
    //changed so not valid 
    return false;

}
2 голосов
/ 17 марта 2012

Убедитесь, что после создания день, месяц и год остаются такими же, как и исходные значения, которые вы передали. Если исходные значения неверны, дата будет скорректирована соответствующим образом. Например, если вы передадите (29, 1, 2011) - обратите внимание, что значение месяца основано на 0, поэтому 1 для февраля - вы вернетесь (1, 3, 2011).

0 голосов
/ 15 февраля 2018

tl; dr

java.time.LocalDate.of( 2018 , 2 , 31 )

➙ catch DateTimeException для неверного номера дня месяца.

java.time

Класс GregorianCalendar имеетбыл вытеснен классом ZonedDateTime как часть java.time , встроенного в Java 8 и более поздние версии.Новый метод был добавлен в старый класс для преобразования.

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;

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

Вы можете извлечь LocalDate из времени ZonedDateTime.

LocalDate ld = zdt.toLocalDate() ;

Вы можете установить месяц по номеру, с нормальной цифрой 1-12 для января-декабря.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Или, лучше, использовать предварительно определенные объекты перечисления Month, по одному на каждый месяц года.Совет: используйте эти Month объекты по всей вашей кодовой базе, а не просто целое число, чтобы сделать ваш код более самодокументируемым, обеспечить допустимые значения и обеспечить безопасность типов .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Допустимое значение

, чтобы проверить, что 29 февраля - только високосный год

Документация для LocalDate.of (год, месяц, день) гласит:

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

Так что ловите DateTimeException.

try { 
    LocalDate ld = LocalDate.of( 2018 , 2 , 31 ) ;  // Invalid, February never has 31 days.
    return Boolean.TRUE ;
} catch ( DateTimeException e ) {
    return Boolean.FALSE ;           
}

високосный год

Да, LocalDate проверяет високосный год для правильной обработки 29 февраля.

try { 
    LocalDate ld = LocalDate.of( 2018 , 2 , 29 ) ;  // Invalid, as 2018 is a common year.
    return Boolean.TRUE ;
} catch ( DateTimeException e ) {
    return Boolean.FALSE ;    
}

false

…
    LocalDate ld = LocalDate.of( 2020 , 2 , 29 ) ;  // Valid, as 2020 is a leap year.
…

true

Сравнить даты

, чтобы проверить, что дата не раньше текущих данных

Полагаю, вы имели в виду "текущая дата".

Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .

Если часовой пояс не указан,JVM неявно применяет свой текущий часовой пояс по умолчанию.Это значение по умолчанию может измениться в любой момент, поэтому ваши результаты могут отличаться.Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.

Укажите правильное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 3-4-буквенное сокращение, такое как EST или IST, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

Сравните с isBefore, isAfter и isEqual.

boolean b = ld.isBefore( today ) ;

О java.time

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

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

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

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

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

  • Java SE 8 , Java SE 9 , а позднее
    • Встроенный-в.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android

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

...