DayJS isValid的行为与Moment不同

时间:2019-10-03 09:47:42

标签: javascript

我正尝试使用dayjs来验证生日,但其isValid返回true的日期不存在。有趣的是,isValid的{​​{1}}运行正常。

moment

由于dayjs('2019/02/31', 'YYYY/MM/DD').isValid() // true moment('2019/02/31', 'YYYY/MM/DD').isValid() // false 的轻巧性,我无法切换到moment

有什么办法解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

moment.isValid()的工作方式(溢出检查)

  

如果解析后的输入结果不存在,moment#isValid将返回false。

dayjs.isValid()的工作方式

如果您查看源代码:

src / index.js

this.$d = parseDate(cfg) // Line 75
// ...
isValid() { // Line 96
  return !(this.$d.toString() === C.INVALID_DATE_STRING)
}

src / constant.js

export const INVALID_DATE_STRING = 'Invalid Date'

如果您查看源文件 parse 并不是一个简单的Date.parse(),因为它考虑了语言环境,日期格式等因素,但似乎每个有效日期都传递给Date( )或Date.parse()是有效

Date.parse('2019/02/31') // 1551567600000
new Date(2019/02/31) // Thu Jan 01 1970 01:00:00 GMT+0100

答案 1 :(得分:0)

请查看this thread。基本上isValid不验证是否存在通过日期,它只是验证日期是否已正确解析。

我不确定这是否适用于所有情况(特别是如果您具有本地化),但是您可以尝试以下方法:

function validate(date, format) {
  return dayjs(date, format).format(format) === date;
}

validate('2019/02/31', 'YYYY/MM/DD') // false

这种检查的原因是

dayjs('2019/02/31', 'YYYY/MM/DD').format('YYYY/MM/DD')

返回2019/03/03。然后,当您将其与初始日期进行比较时(因为格式相同,所以应该可以),您应该获得相同的值-在这种情况下,您不需要。