DayJS isValid 的行为与 Moment 不同

Kel*_*han 11 javascript

我试图使用验证生日,dayjs但它isValid返回true的日期不存在。有趣的是,isValidbymoment运行得很好。

dayjs('2019/02/31', 'YYYY/MM/DD').isValid() // true
moment('2019/02/31', 'YYYY/MM/DD').isValid() // false
Run Code Online (Sandbox Code Playgroud)

moment由于重量轻,我无法切换到dayjs

知道如何解决这个问题吗?

ble*_*ert 12

2021 年 8 月:现在可以使用.isValid()方法检测这些无效日期,并将第三个参数作为 true 传递给dayjs构造函数:

dayjs('2019/02/31', 'YYYY/MM/DD').isValid() // true
dayjs('2019/02/31', 'YYYY/MM/DD',true).isValid() // false
Run Code Online (Sandbox Code Playgroud)

有关此严格解析参数的更多信息现在可以在官方文档中找到。

注意:在调用 isValid() 之前Node.js我必须加载第一个customParseFormat插件才能收到预期的有效性结果:

const dayjs = require("dayjs");
var customParseFormat = require("dayjs/plugin/customParseFormat");
dayjs.extend(customParseFormat);
Run Code Online (Sandbox Code Playgroud)


zhu*_*ber 7

请看看这个线程。基本上isValid不验证传递的日期是否存在,它只是验证日期是否已正确解析。

我不确定这是否适用于所有场景(特别是如果您有本地化),但您可以尝试以下操作:

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

validate('2019/02/31', 'YYYY/MM/DD') // false
Run Code Online (Sandbox Code Playgroud)

进行这种检查的原因是

dayjs('2019/02/31', 'YYYY/MM/DD').format('YYYY/MM/DD')
Run Code Online (Sandbox Code Playgroud)

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