Подтвердить что ты не робот

Дата до метода возвращает false, если обе даты равны

при сравнении двух дат с датой до, если даты близки, она возвращает false следующим образом:

  • date1: Вт дек 18 00:00:00 GMT + 02: 00 2012
  • date2: Вт дек 18 00:00:00 GMT + 02: 00 2012

метод date1.before(date2) всегда возвращает false в этом случае, что для меня не имеет смысла (не относится к моему делу другими словами). Я хочу проверить, соответствует ли дата (день/месяц/год) сегодняшней дате (день/месяц/год)?

4b9b3361

Ответ 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 проверяет, является ли одна дата до другой. Если даты равны, это очевидно, что это неверно.