【问题标题】:Moment js validating edge case, dates like feb 30th [duplicate]Moment js 验证边缘案例,日期如 2 月 30 日 [重复]
【发布时间】:2021-06-28 16:01:45
【问题描述】:

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

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

【问题讨论】:

  • dedicated parsing section of the docs中所述:注意:因为这反映了原生的Date参数,月、时、分、秒、毫秒都是零索引。年和月中的天数为 1。,因此您正在为 3 月 31 日创建一个有效日期的时刻对象。

标签: date validation momentjs luxon


【解决方案1】:

我不知道 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, 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2019-10-29
    相关资源
    最近更新 更多