ТЛ; др
LocalDate.now( ZoneId.of( "America/Montreal" )
.minusMonths( 1 )
.isAfter( LocalDate.parse( "2017-01-23" ) )
java.time
Современный подход использует классы java.time, а не утомительные классы, такие как Date
& Calendar
.
Сегодня
Сначала получите текущую дату. Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса.
Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж Франция - это новый день, а еще «вчера» в Монреаль Квебек .
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 3-4-буквенное сокращение, например EST
или IST
, так как они не истинных часовых поясов, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
Расчет месяца назад
Затем определите дату месяц назад .
LocalDate monthAgo = today.minusMonths( 1 ) ;
Вот правила, используемые LocalDate::minusMonths
, процитированные из документа Java 8 class:
Этот метод вычитает указанное количество из поля месяцев в три этапа:
Вычтите входные месяцы из поля месяца года
Проверьте, будет ли полученная дата недействительной
При необходимости настройте день месяца на последний действительный день
Например, 2007-03-31 минус один месяц приведет к неверной дате 2007-02-31. Вместо того, чтобы возвращать неверный результат, вместо этого выбирается последний действительный день месяца, 2007-02-28.
Или, возможно, в ваших деловых правилах вы имели в виду «30 дней» вместо календарного месяца.
LocalDate thirtyDaysAgo = today.minusDays( 30 ) ;
Input
Вам назначена дата. Это должно быть передано в ваш код как LocalDate
объект.
LocalDate ld = LocalDate.of( 2017 , Month.JANUARY , 23 ) ;
Если используется строка, используйте стандартные форматы ISO 8601 . Для других форматов выполните поиск переполнения стека для DateTimeFormatter
class.
LocalDate ld = LocalDate.parse( "2017-01-23" ) ;
Сравнение
Теперь сравните. Вызовите методы isBefore
, isEqual
, isAfter
.
Boolean outdated = ld.isBefore( monthAgo ) ;
Performance
Что касается вопроса производительности, поднятого в Вопросе: не беспокойтесь об этом. Это вычисление и сравнение за месяц назад очень вряд ли станет узким местом в вашем приложении. Избегайте преждевременной оптимизации .
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где получить классы java.time?
The ThreeTen-Extra Проект расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .