Как сравнить даты в Java? [дубликат]
этот вопрос уже есть ответ здесь:
Java: как проверить, находится ли дата в определенном диапазоне?
11 ответов
как сравнить даты между ними в Java?
пример:
дата1 составляет 22-02-2010
дата2 составляет
дата3 составляет 25-12-2010
date3 всегда больше, чем date1 и date2 всегда сегодня. Как проверить, находится ли сегодняшняя дата между датами 1 и 3?
11 ответов:
дата и до и после методы и может быть по сравнению друг с другом следующим образом:
if(todayDate.after(historyDate) && todayDate.before(futureDate)) { // In between }для всестороннего сравнения:
if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) { /* historyDate <= todayDate <= futureDate */ }вы также можете дать Joda Времени идти, но обратите внимание, что:
Joda времени является де-факто стандартная библиотека даты и времени для Java до Java SE 8. Теперь пользователям предлагается перейти на java.время ( JSR-310).
задние порты доступны для Java 6 и 7, а также Android.
использовать compareTo:
date1.compareTo(date2);
Ниже приведены наиболее распространенные способы сравнения дат. Но я предпочитаю первый
Подход-1: Использование Даты.до (), Дата.после() и дата.равно ()
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 : Дата.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: Календарь.перед (), календарь.после() и календарь.равно ()
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"); }
tl; dr
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 однозначны, понятны во всех человеческих культурах и легко анализируются машиной.
для значения только для даты стандартный формат-гггг-ММ-ДД. Обратите внимание, как этот формат имеет преимущество быть хронологическим при сортировке в алфавитном порядке.
LocalDateThe
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 );в дату-время работа, как правило, лучше всего определить промежуток времени с помощью полуоткрытого подхода, где начало включительно в то время как окончание эксклюзивные. Поэтому мы хотим знать, является ли сегодня то же самое или позже, чем начало, а также до остановки. Более краткий способ сказать "то же самое или позже, чем начало" - это "не до начала".
Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;посмотреть ответ от gstackoverflow отображение списка методов сравнения вы можете вызов.
о java.время
The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как
java.util.Date,Calendar,&SimpleDateFormat.The Joda Времени, теперь режим обслуживания, советует миграция в java.время занятия.
чтобы узнать больше, смотрите Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.
где получить java.время занятий?
- Java SE 8 и SE 9 и позже
- встроенный.
- часть стандартного Java API в комплекте реализация.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- большая часть java.функциональность время портированы с Java 6 и 7 в ThreeTen-Backport.
- Android
- на ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше) специально для Android.
- посмотреть как использовать ThreeTenABP....
в ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как
Interval,YearWeek,YearQuarterи больше.
обновление: этот раздел" Joda-Time " ниже остается нетронутым как история. Элемент Joda Времени, теперь ремонт режим, советует миграция в java.время классы.
Joda Времени
другие ответы верны в отношении прилагаемой java.утиль.Дата и java.утиль.Календарь занятий. Но эти классы, как известно, хлопотное. Итак, вот пример кода, использующего Joda Времени 2.3 библиотека.
если вы действительно хотите дату без какой-либо части времени и без часового пояса, то используйте
LocalDateкласса в Джода-Время. Этот класс предоставляет методы сравнения, включаяcompareTo(используется с Java Comparators),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 выполняет сравнения с помощью Полуоткрытых подход, где начало диапазона включительно в то время как окончание эксклюзивные. Этот подход является мудрым для обработки промежутков времени. Поиск StackOverflow для получения дополнительной информации.
сравните две даты:
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 и выше
эти методы существуют в
LocalDate,LocalTimeиLocalDateTimeклассы.эти классы встроены в Java 8 и более поздние версии. Большая часть java.функциональность времени обратно переносится на Java 6 & 7 in ThreeTen-Backport и далее адаптированы к Android на ThreeTenABP (см. как использовать...).
можно использовать
Date.getTime()которых:возвращает количество миллисекунд с 1 января 1970 года, 00: 00: 00 GMT представлен этим объектом даты.
Это означает, что вы можете сравнить их так же, как числа:
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 < */
используйте getTime (), чтобы получить числовое значение даты, а затем сравнить с помощью возвращенных значений.
попробуй такое
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; } }
этот код определяет сегодня находится в некоторой продолжительности.. на основе корейского языка
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; }
Comments