Moment js 验证边缘情况,日期如 2 月 30 日

问题描述

我想验证以下日期是否有效:2021 年 2 月 30 日。 因此,主要问题是 2021 年 2 月 30 日不应该是有效日期或 2021 年 4 月 31 日。是否可以使用 moment js 或 luxon 来实现?还是应该使用其他方法

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

解决方法

我不知道 moment.js 或 luxon ,但在基本的 JS 中是可以实现的(虽然有点啰嗦)

JavaScript 会更新日期,因此 2 月 29 日是 3 月 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,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;
}