Дата до метода возвращает false, если обе даты равны
при сравнении двух дат с датой до, если даты близки, она возвращает false следующим образом:
- date1: Вт дек 18 00:00:00 GMT + 02: 00 2012
- date2: Вт дек 18 00:00:00 GMT + 02: 00 2012
метод date1.before(date2)
всегда возвращает false в этом случае, что для меня не имеет смысла (не относится к моему делу другими словами).
Я хочу проверить, соответствует ли дата (день/месяц/год) сегодняшней дате (день/месяц/год)?
Ответы
Ответ 1
Как date1.equals(date2)
, нормально, что date1.before(date2)
возвращает false. Как и date1.after(date2)
.
Обе даты одинаковы, поэтому один не находится перед другим.
Из javadoc: true тогда и только тогда, когда момент времени, представленный этим объектом Date, строго раньше, чем момент, представленный, когда; false в противном случае.
Попробуйте что-то вроде:
if(date1.before(date2) || date1.equals(date2)) ...
Ответы, представленные ниже, предлагают тестирование для инверсии, и они правы:
if(!date1.after(date2)) ...
Оба теста эквивалентны (некоторые быстрые тесты даже не показывают значительного разрыва в производительности, но разрыв всегда является преимуществом второго).
Ответ 2
Вы можете просто проверить обратное:
!date1.after(date2)
Вы всегда можете преобразовать строгую проверку заказа в нестандартную проверку таким образом. Поскольку математически:
a > b ⇔ ¬ (a ≤ b)
Ответ 3
Если даты совпадают, то, очевидно, один из них НЕ находится перед другим: false is the correct return for date1.before(date2) where date1 == date2
.
Если вам нужно включить равенство, почему бы не сделать отрицание на .after()
(очевидно, если дата 1 является NOT после даты 2, то она равна или раньше), но я бы удостоверился, что это на самом деле правильная логика для что вы пытаетесь выполнить.
Если равенство - это особый случай, который нужно обрабатывать по-разному, тогда у вас есть отдельный тест для .equals()
.
Ответ 4
вы можете использовать обратный, как это было предложено bowmore: !date1.after(date2)
Или, если вы ищете диапазоны, между может включать конечные точки, и в этом случае вы могли бы use return !d.before(min) && !d.after(max)
Ответ 5
Вы также можете использовать это:
boolean check = dateOne.before(dateTwo) || DateUtils.isSameDay(dateOne, dateTwo);
DateUtils - это пакет org.apache.commons.lang.time
Ответ 6
Реальная проблема с вашим кодом, возможно, заключается в том, что вы не принимаете во внимание миллины, а функция перед ней
Два объекта java.util.Date с результатом toString: вс 28 августа 00:00:00 CEST 2016
может иметь другое значение при вызове getTime.
Например,
Date d1;
Date d2;
d1.toString(); // = Sun Aug 28 00:00:00 CEST 2016
d2.toString(); // = Sun Aug 28 00:00:00 CEST 2016
d1.getTime(); // = 1472335200605
d2.getTime(); // = 1472335200000
Конечно, эти даты не равны.
Из javadoc:
"Возвращает: true тогда и только тогда, когда момент времени, представленный этим объектом Date, строго предшествует мгновенному представлению, когда false, в противном случае."
Ответ 7
Это довольно нормальное поведение, потому что dateBefore
проверяет, является ли одна дата до другой. Если даты равны, это очевидно, что это неверно.