Мне нужно выполнить проверку даты в формате «ДД / ММ / ГГГГ». Дата должна:

  • не быть в прошлом
  • быть максимум 6 месяцев в будущем

Он работает нормально, но принимает текущий день как недопустимую дату. Я много чего пробовал, но не могу понять, почему. Может проблема в строительстве ...

let daaa = moment(new Date()).date();
let daaad = moment(new Date()).date();
alert(moment(daaad).isSame(daaa));

Также попробуйте new Date().getTime() and getDate()

const selectedDate = new Date(value.split('/').reverse().join('-'));
let today = new Date(Date.now());
let plusSixMonths = new Date(Date.now());
plusSixMonths.setMonth(plusSixMonths.getMonth() + 6);
if (selectedDate >= today && plusSixMonths > selectedDate) return true;

Я ожидал также поймать текущую дату в действительных датах.

1
dist 28 Окт 2019 в 13:54

1 ответ

Лучший ответ

Проблема вызвана Date.now(), оно включает текущее время. Итак, если вы проверяете 28/10/2019, то 2019-10-28T00: 00: 00 почти наверняка раньше сегодняшней даты с компонентом времени:

(selectedDate >= today && plusSixMonths > selectedDate)

Становится

(2019-10-28T00:00:00 >= 2019-10-28T11:02:32 && 2020-04-28T11:02:32 > 2019-10-28T00:00:00)

Что будет false.

Вам нужно будет удалить компоненты времени из today (new Date() также получает текущее время как объект даты)

let today = new Date();
// set hours, minutes, seconds and milliseconds to zero i.e. 12am
today.setHours(0, 0, 0, 0);

Тогда вы сможете провести сравнение, как и ожидали.

Update Спасибо RobG за указание на то, что setHours также может устанавливать минуты, секунды и миллисекунды.

1
phuzi 31 Окт 2019 в 11:19
Если ответ решил вашу проблему, пожалуйста, проголосуйте и отметьте его как принятый ответ.
 – 
phuzi
28 Окт 2019 в 14:24
Извините, я здесь новичок, и да, ответ идеально подходит для меня. Работает отлично. но мой голос не появится, потому что у меня недостаточно репутации.
 – 
dist
29 Окт 2019 в 11:14
2
Это может быть несколько короче, как today.setHours(0,0,0,0). ;-)
 – 
RobG
31 Окт 2019 в 03:58