Moment js проверяет пограничный случай, такие даты, как 30 февраля

Я хочу проверить, действительна ли следующая дата: 30 февраля 2021 года. Итак, основная проблема заключается в том, что 30 февраля 2021 года не должно быть действительной датой или 31 апреля 2021 года. Возможно ли добиться этого с помощью момент js или luxon? или я должен использовать другой подход?

   let m = moment([2021, 2, 31]);
   console.log("Date is valid", m.isValid()); \\returns true which is not a valid date!

person Paarmin    schedule 01.04.2021    source источник
comment
Как указано в специальном разделе документации: Примечание. Поскольку это отражает собственные параметры Date, месяцы, часы, минуты, секунды и миллисекунды индексируются нулями. Годы и дни месяца индексируются 1., поэтому вы создаете объект момента для 31 марта, который является допустимой датой.   -  person VincenzoC    schedule 01.04.2021


Ответы (1)


Я не знаю moment.js или luxon , но это достижимо в базовом JS (хотя и немного многословно)

JavaScript будет повышать дату, поэтому 29 февраля будет 1 марта.

Поэтому мы можем сравнить версию до и после:

var month = 1; // zero based - 1 is feb
var day = 30;
var year = 2021;

var testDate = new Date(year, month, day); // will convert to 2nd of March

var parsedDate = testDate.getDate(); // will be 2
var parsedMonth = testdate.getMonth() // will be 2 , zero based, March
var parsedYear = testDate.getFullYear(); // remains 2021 in this case

var isValidDate = parsedDate === day && parsedMonth === month && parsedYear === year;

Это может быть сильно сжато, но я сделал его как можно более раздутым для удобочитаемости.

вы можете легко превратить его в функцию, что-то вроде этого (не проверено)

function IsValidDate(year, month, day){
 var InputMonthsAreOneBased = 0; // change to 1 if needed
 var testDate = new Date(year, month - InputMonthsAreOneBased, day );
 return testDate.getDate() === day && testdate.getMonth() === (month - InputMonthsAreOneBased) && testDate.getFullYear() === year;
}

person jimP76    schedule 01.04.2021