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