Как сравнить даты в Java?
Как сравнить даты между в Java?
Пример:
date1 is 22-02-2010
date2 is 07-04-2010
сегодня
date3 is 25-12-2010
date3
всегда больше чем date1
а также date2
всегда сегодня. Как мне проверить, находится ли сегодняшняя дата между date1 и date 3?
11 ответов
Дата имеет методы до и после и может сравниваться друг с другом следующим образом:
if(todayDate.after(historyDate) && todayDate.before(futureDate)) {
// In between
}
Для инклюзивного сравнения:
if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) {
/* historyDate <= todayDate <= futureDate */
}
Вы также можете попробовать Joda-Time, но учтите, что:
Joda-Time является де-факто стандартной библиотекой даты и времени для Java до Java SE 8. Теперь пользователям предлагается перейти на java.time ( JSR-310).
Back-порты доступны для Java 6 и 7, а также для Android.
Ниже приведены наиболее распространенные способы сравнения дат. Но я предпочитаю первый
Подход-1: Использование Date.before(), Date.after() и Date.equals()
if(date1.after(date2)){
System.out.println("Date1 is after Date2");
}
if(date1.before(date2)){
System.out.println("Date1 is before Date2");
}
if(date1.equals(date2)){
System.out.println("Date1 is equal Date2");
}
Подход-2: Date.compareTo()
if(date1.compareTo(date2)>0){
System.out.println("Date1 is after Date2");
}else if(date1.compareTo(date2)<0){
System.out.println("Date1 is before Date2");
}else{
System.out.println("Date1 is equal to Date2");
}
Подход-3: Calender.before(), Calender.after() и Calender.equals()
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
if(cal1.after(cal2)){
System.out.println("Date1 is after Date2");
}
if(cal1.before(cal2)){
System.out.println("Date1 is before Date2");
}
if(cal1.equals(cal2)){
System.out.println("Date1 is equal Date2");
}
ТЛ; др
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Boolean isBetween =
( ! today.isBefore( localDate1 ) ) // “not-before” is short for “is-equal-to or later-than”.
&&
today.isBefore( localDate3 ) ;
Или лучше, если вы добавите библиотеку ThreeTen-Extra в свой проект.
LocalDateRange.of(
LocalDate.of( … ) ,
LocalDate.of( … )
).contains(
LocalDate.now()
)
Полуоткрытый подход, где начало включительно, а окончание - исключительно.
Неправильный выбор формата
Кстати, это плохой выбор формата для текстового представления даты или значения даты-времени. По возможности придерживайтесь стандартных форматов ISO 8601. Форматы ISO 8601 однозначны, понятны для разных культур и легко разбираются на машине.
Для значения только для даты стандартным форматом является ГГГГ-ММ-ДД. Обратите внимание, что этот формат имеет преимущество в том, что он хронологичен при сортировке по алфавиту.
LocalDate
LocalDate
класс представляет значение только для даты без времени суток и без часового пояса.
Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париже Франция - новый день, а в Монреале-Квебеке все еще "вчера".
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
Поскольку ваши входные строки имеют нестандартный формат, мы должны определить шаблон форматирования для соответствия.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );
Используйте это для разбора входных строк.
LocalDate start = LocalDate.parse( "22-02-2010" , f );
LocalDate stop = LocalDate.parse( "25-12-2010" , f );
В работе с датой и временем, как правило, лучше всего определять промежуток времени с помощью подхода Half-Open, где начало включительно, а окончание - эксклюзивно. Итак, мы хотим знать, будет ли сегодня то же самое или позже, чем начало, а также до остановки. Более короткий способ сказать "такой же или позже начала" - "не раньше начала".
Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;
См. Ответ gstackru, показывающий список методов сравнения, которые вы можете вызвать.
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые классы даты и времени, такие как java.util.Date
, Calendar
& SimpleDateFormat
,
Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, смотрите Oracle Tutorial. И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.
Где взять классы java.time?
- Java SE 8 и SE 9 и позже
- Встроенный.
- Часть стандартного Java API со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
- Android
- Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
- Смотрите Как использовать ThreeTenABP….
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval
, YearWeek
, YearQuarter
и многое другое.
ОБНОВЛЕНИЕ: Этот раздел "Joda-Time" ниже остается неизменным как история. Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Joda времени
Другие ответы верны в отношении связанных классов java.util.Date и java.util.Calendar. Но эти классы, как известно, хлопотно. Итак, вот несколько примеров кода с использованием библиотеки Joda-Time 2.3.
Если вы действительно хотите дату без какой-либо временной части и без часового пояса, используйте LocalDate
класс в Йода-Тайм. Этот класс предоставляет методы сравнения, включая compareTo
(используется с компараторами Java), isBefore
, isAfter
, а также isEqual
,
Входы...
String string1 = "22-02-2010";
String string2 = "07-04-2010";
String string3 = "25-12-2010";
Определите форматер, описывающий входные строки...
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );
Используйте форматтер для разбора строк в объекты LocalDate...
LocalDate localDate1 = formatter.parseLocalDate( string1 );
LocalDate localDate2 = formatter.parseLocalDate( string2 );
LocalDate localDate3 = formatter.parseLocalDate( string3 );
boolean is1After2 = localDate1.isAfter( localDate2 );
boolean is2Before3 = localDate2.isBefore( localDate3 );
Дамп на консоль…
System.out.println( "Dates: " + localDate1 + " " + localDate2 + " " + localDate3 );
System.out.println( "is1After2 " + is1After2 );
System.out.println( "is2Before3 " + is2Before3 );
Когда беги…
Dates: 2010-02-22 2010-04-07 2010-12-25
is1After2 false
is2Before3 true
Посмотрите, находится ли второй между двумя другими (исключительно, что означает, что он не равен ни одной конечной точке)…
boolean is2Between1And3 = ( ( localDate2.isAfter( localDate1 ) ) && ( localDate2.isBefore( localDate3 ) ) );
Работа с промежутками времени
Если вы работаете с промежутками времени, я предлагаю изучить в Joda-Time классы: продолжительность, интервал и период. Методы, такие как overlap
а также contains
сделать сравнения легко.
Текстовые представления см. В стандарте ISO 8601:
- продолжительность
Формат: PnYnMnDTnHnMnS
Пример: P3Y6M4DT12H30M5S
(Означает "три года, шесть месяцев, четыре дня, двенадцать часов, тридцать минут и пять секунд") - интервал
Формат: начало / конец
Пример: 2007-03-01T13:00:00Z/2008-05-11T15:30:00Z
Классы Joda-Time могут работать со строками в обоих этих форматах, как на входе (синтаксический анализ), так и на выходе (генерирование строк).
Joda-Time выполняет сравнения, используя подход Half-Open, где начало диапазона включено, а окончание является эксклюзивным. Этот подход является мудрым для обработки промежутков времени. Поиск Stack Overflow для получения дополнительной информации.
Сравните две даты:
Date today = new Date();
Date myDate = new Date(today.getYear(),today.getMonth()-1,today.getDay());
System.out.println("My Date is"+myDate);
System.out.println("Today Date is"+today);
if (today.compareTo(myDate)<0)
System.out.println("Today Date is Lesser than my Date");
else if (today.compareTo(myDate)>0)
System.out.println("Today Date is Greater than my date");
else
System.out.println("Both Dates are equal");
Обновление для Java 8 и позже
isAfter()
isBefore()
isEqual()
compareTo()
Эти методы существуют в LocalDate
, LocalTime
, а также LocalDateTime
классы.
Эти классы встроены в Java 8 и выше. Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP (см. Как использовать…).
Ты можешь использовать Date.getTime()
который:
Возвращает количество миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу, представленное этим объектом Date.
Это означает, что вы можете сравнить их как числа:
if (date1.getTime() <= date.getTime() && date.getTime() <= date2.getTime()) {
/*
* date is between date1 and date2 (both inclusive)
*/
}
/*
* when date1 = 2015-01-01 and date2 = 2015-01-10 then
* returns true for:
* 2015-01-01
* 2015-01-01 00:00:01
* 2015-01-02
* 2015-01-10
* returns false for:
* 2014-12-31 23:59:59
* 2015-01-10 00:00:01
*
* if one or both dates are exclusive then change <= to <
*/
Попробуй это
public static boolean compareDates(String psDate1, String psDate2) throws ParseException{
SimpleDateFormat dateFormat = new SimpleDateFormat ("dd/MM/yyyy");
Date date1 = dateFormat.parse(psDate1);
Date date2 = dateFormat.parse(psDate2);
if(date2.after(date1)) {
return true;
} else {
return false;
}
}
Используйте getTime(), чтобы получить числовое значение даты, а затем сравните, используя возвращенные значения.
Этот код определяет сегодня в некоторой продолжительности.. на основе локали KOREA
Calendar cstart = Calendar.getInstance(Locale.KOREA);
cstart.clear();
cstart.set(startyear, startmonth, startday);
Calendar cend = Calendar.getInstance(Locale.KOREA);
cend.clear();
cend.set(endyear, endmonth, endday);
Calendar c = Calendar.getInstance(Locale.KOREA);
if(c.after(cstart) && c.before(cend)) {
// today is in startyear/startmonth/startday ~ endyear/endmonth/endday
}
Этот метод работал для меня:
public static String daysBetween(String day1, String day2) {
String daysBetween = "";
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date1 = myFormat.parse(day1);
Date date2 = myFormat.parse(day2);
long diff = date2.getTime() - date1.getTime();
daysBetween = ""+(TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
} catch (ParseException e) {
e.printStackTrace();
}
return daysBetween;
}