2015-12-01 3 views
21

Я пытаюсь проверить Java 8, если дата старше 10 лет и не старше 20 лет. Я использую Date.before() и Date.after() и минуя currentDate-10 лет и currentDate-20 лет как аргументы.Проверьте, если дата старше 10 лет и не старше 20 лет

Может кто-нибудь, пожалуйста, предложите, какой самый чистый способ получить дату 10-летнего и 20-летнего в формате даты, чтобы передать ее в моих before() и after() методах?

+0

Я не 100% уверен, что об этом (никогда не использовал дату до/после), но вы пробовали сравнение с датой инициированной на сегодня , затем установите еще две даты относительно этого (10 лет и 20 лет назад), затем используйте эти методы? – Foleosy

+1

heres хорошее читать: http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html – Stultuske

+1

http://stackoverflow.com/questions/883060/how-can-i- define-if-a-date-is-between-two-dates-in-java – Stefan

ответ

11

Используя Calendar, вы можете легко получить 10-летнюю дату и 20-летнюю дату с текущей даты.

Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.YEAR, -10); 
Date d1 = calendar.getTime(); 
calendar.add(Calendar.YEAR, -10); 
Date d2 = calendar.getTime(); 

Как вы используете Java 8 вы можете также использовать LocalDate

LocalDate currentDate = LocalDate.now(); 
    Date d1 = Date.from(currentDate.minusYears(10).atStartOfDay(ZoneId.systemDefault()).toInstant()); 
    Date d2 = Date.from(currentDate.minusYears(20).atStartOfDay(ZoneId.systemDefault()).toInstant()); 

Для сравнения можно использовать date.after() и date.before() методы, как вы сказали.

if(date.after(d1) && date.before(d2)){ //date is the Date instance that wants to be compared 
     //// 
    } 

В before() и after() методы реализованы в Calendar и LocalDate тоже. Вы можете использовать эти методы в этих случаях без преобразования в экземпляры java.util.Date.

+8

Хотя это работает в java 8, я бы рекомендовал использовать новую дату и время api. – SpaceTrucker

+2

Если вы используете LocalDate, нет необходимости возвращаться к дате ... – assylias

+1

Я думал, что OP хочет использовать методы 'Date.after()' и 'Date.before()' –

28

Для этого вы можете использовать java.time.LocalDate. Пример: Если вам нужно проверить, если 01/01/2005 между этой продолжительностью, вы можете использовать

LocalDate date = LocalDate.of(2005, 1, 1); // Assign date to check 
if(date.isBefore(today.minusYears(10)) && date.isAfter(today.minusYears(20))) 
    //Do Something 
+2

Я взял на себя смелость создавая отдельную переменную для решения проблемы @SpaceTrucker. Не стесняйтесь откатываться, если хотите. Также обратите внимание, что в этом ответе игнорируются вопросы * time * и * time zone *. Вероятно, я сначала усекаю время, используя 'atStartOfDay', а обработка часового пояса будет зависеть от конкретного варианта использования. – jpmc26

4

Другой возможность получить количество лет между датой проверки и верхней датой. Если число года больше 0 и меньше 10, это означает, что дата проверки старше 10 лет и старше 20 лет.

Этот код будет определять любую дату в интервале ]now - 20 years ; now - 10 years[:

public static void main(String[] args) { 
    LocalDate dateToCheck = LocalDate.now().minusYears(20).plusDays(1); 

    LocalDate upperYear = LocalDate.now().minusYears(10); 
    long yearCount = ChronoUnit.YEARS.between(dateToCheck, upperYear); 
    if (yearCount > 0 && yearCount < 10) { 
     System.out.println("date is older than 10 years and newer than 20 years"); 
    } 
} 
+2

Я бы просто использовал 'long l = LocalDate.now() до (dateToCheck, ChronoUnit.YEARS); if (l <=-10 && l> -20) 'если задание« проверить, находится ли возраст в этом интервале ».Но ваш ответ по-прежнему остается единственным, кто не ошибается в стиле XY вопроса, который фокусируется на использовании 'before' и' after' вместо фактической задачи. Обратите внимание, что 'x.until (y, YEARS)' совпадает с 'YEARS.between (x, y)', но последний делегирует первое. – Holger

+1

@Holger Однако есть небольшая деталь, я думаю, что это проверит интервал '] сейчас - 20 лет; теперь - 10 лет] '(обратите внимание на включительную оценку для верхней части). Но ОП не сказал, должны ли быть включены ограничения или нет. – Tunaki

+1

Ну, вы можете выбрать операторы '>' или '> =' resp. '<' или '<=', как вам нравится, но вам не нужны промежуточные экземпляры 'LocalDate' ... – Holger

Смежные вопросы