首页 > 解决方案 > momentjs 验证功能无法正常工作

问题描述

我正在开发一个聊天机器人,用户将在其中输入不同格式的日期,因此我创建了一个函数来验证他们使用 momentjs 输入的日期以及我提供的流行格式列表。

问题是 isValid 即使使用错误的格式(例如(8 月 35 日))也会返回 true。我发现我提供的数组中的最后两种格式是导致问题的原因,但我不知道为什么。


const validateDate = (date) => {
  const formats = ["DMMM", "DMMMYY", "YYYY-MM-D", "YYYY-MM"];
  const momentDate = moment(date, formats);

  console.log(momentDate.isValid());
  console.log(momentDate);
};
validateDate("29 Aug");     //Moment<2020-08-29T00:00:00+02:00>
validateDate("35 Aug");   //Moment<2035-01-01T00:00:00+02:00>

标签: node.jsvalidationmomentjs

解决方案


让我们简单点:

D - 代表日。
M - 代表月份。
Y - 代表年份。

在上述情况下,年份设置为默认 2020(当年)这就是为什么 29 到 8 月的默认日期为:'2020-08-29'

我认为您正在寻找第二种情况的格式是:

const dayFormat = ["DD MMM"];

您可以将其添加到格式列表:

const formats = ["DMMM", "DMMMYY", "YYYY-MM-D", "YYYY-MM", "DD MMM"];

在不同格式之间混合时存在问题,例如最后两种格式:"YYYY-MM-D""YYYY-MM". 由于日期被转换为一年,因此对原始日期犯了错误。

我认为你应该这样做:

  1. 确保您启用了所有这些格式,并且您现在拥有的格式之间没有冲突。
  2. 我认为在这些情况下,最好自定义验证功能,以便易于维护。以下是自定义选项的示例:

const formatValidator = (value, validFormats) => {
    return moment(value, validFormats, true).isValid()
}

const validateDate = (date) => {
    const formats = ["DD MMM", "DMMM", "DMMMYY", "YYYY-MM-D", "YYYY-MM"] // original
    const momentDate = moment(date, formats)
    console.log(formatValidator(momentDate, formats))
}
validateDate("29 Aug")
validateDate("35 Aug")

推荐阅读