Дата ранее, чем месяц назад - PullRequest
10 голосов
/ 16 января 2010

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

Ответы [ 3 ]

21 голосов
/ 16 января 2010

Обновлено до Java 8

Класс LocalDate Класс может использоваться:

LocalDate aDate = LocalDate.parse("2017-01-01");
return aDate.isBefore( LocalDate.now().minusMonths(1));

Для предыдущих версий класс Calendar работал бы.

Calendar calendar = Calendar.getInstance();
calendar.add( Calendar.MONTH ,  -1 );
return aDate.compareTo( calendar.getTime() ) < 0;

Пример кода:

import static java.lang.System.out;
import java.time.LocalDate;

public class Sample {
    public static void main( String [] args ) {
        LocalDate aMonthAgo = LocalDate.now().minusMonths(1);
        out.println( LocalDate.parse("2009-12-16").isBefore(aMonthAgo));
        out.println( LocalDate.now().isBefore(aMonthAgo));
        out.println( LocalDate.parse("2017-12-24").isBefore(aMonthAgo));
    }
}

печать

true
false
false
4 голосов
/ 16 января 2010

Использование Joda Time :

DateTime dt1 = new DateTime(); //Now
DateTime dt2 = new DateTime(2009,9,1,0,0,0,0); //Other date
if (dt1.plusMonths(-1) > dt2) {
    //Date is earlier than a month ago
}
2 голосов
/ 21 августа 2017

ТЛ; др

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:

Этот метод вычитает указанное количество из поля месяцев в три этапа:

  1. Вычтите входные месяцы из поля месяца года

  2. Проверьте, будет ли полученная дата недействительной

  3. При необходимости настройте день месяца на последний действительный день

Например, 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 .

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