node.js - 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>
解决方案
让我们简单点:
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"
. 由于日期被转换为一年,因此对原始日期犯了错误。
我认为你应该这样做:
- 确保您启用了所有这些格式,并且您现在拥有的格式之间没有冲突。
- 我认为在这些情况下,最好自定义验证功能,以便易于维护。以下是自定义选项的示例:
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")
推荐阅读
- css - 我们可以在microsoft bot框架中自定义卡片中按钮的设计吗
- c++ - 从键盘读取整数的 C++ 函数
- ruby-on-rails - 调整谷歌云图像的大小
- php - Symfony2-Yaml:如何在转储数组时在 yml 文件中插入注释
- c# - 关注点分离 - 如何将 GET/PUT/PATCH/POST/DELETE/ETC 分离到一个微服务中,从外部获取其模型和 DTO
- vba - 宏检查打印了多少份或阻止打印,除了宏
- python-3.x - 出现错误:/usr/bin/python:没有名为 thrift_compiler 的模块
- python - Airflow BashOperator OSError: [Errno 2] No such file or directory
- reactjs - 将函数作为道具发送给孩子
- java - 字段“ClassName”被morphia插入到mongodb中