为什么 moment(date).isValid() 返回错误的结果



当我检查以下日期时,它返回真实结果,为什么?

const value = "3";
if (moment(new Date(value), "DD-MM-YYYY HH:mm", true).isValid())  // true
{ }

const value = "3";
if (moment(new Date(value)).isValid())  // true
{ }

那是因为new Date("3")是有效日期和

console.log(new Date("3"))

这是表明您需要清理日期字符串并且不应依赖于本机解析器的情况之一,除非您确定您的字符串已经过验证并且符合要求。

ECMA-262 日期(值(构造函数规范
日期.解析

如果 String 不符合该格式,则函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式。

因此,它不符合"日期时间字符串格式",它要求字符串以"YYYY"开头,因此它进入类似于上述规则的特定于实现的解析,但使用的形式:"MM-DD-YYYY"。

使用严格模式(将 moment(( 的第三个参数设置为 true(的目的是让 moment 进行字符串解析并确定它是否符合您提供的格式(例如,避免像这样的意外解析行为(。 如果使用 Date(( 进行解析,则不再使用 moment 的严格模式来验证字符串是否符合所需的格式。

let value = "3";
function checkDate(value){
console.log(value,
moment(value, "DD-MM-YYYY HH:mm", true).isValid() ? 'valid' : 'invalid')
}
value = "01-01-2011 11:22"
checkDate(value)
value = "01-01-2011 11:22Z"
checkDate(value)
value = "3"
checkDate(value)
value = new Date("3").toString()
checkDate(value)
value = new Date('INVALID DATE')
checkDate(value)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.25.3/moment-with-locales.min.js" integrity="sha256-8d6kI5cQEwofkZmaPTRbKgyD70GN5mDpTYNP9YWhTlI=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.28/moment-timezone-with-data.js" integrity="sha256-O1PdKrSbpAYWSBteb7yX/CMmHhu3US31mtCbsryGwaY=" crossorigin="anonymous"></script>

如果您不需要验证日期字符串(例如防止意外的解析行为(,不需要担心非现代浏览器,并且实际上只需要将符合要求的日期字符串和格式解析为基本字符串格式,则可以将本机 Date(( 与 Intl.DateTimeFormat 或 Date.prototype.toLocaleString 一起使用。
TL;DR 您现在使用它的方式意味着您实际上不需要时刻

由于3是有效的日期,因此日期还仅支持年份或仅支持月份格式。

如果您尝试new Date("YYYY")--> 这是一个有效的日期 如果您尝试new Date("MM")--> 这是一种有效的格式

所以,对于new Date("{1 to 12}")它会接受

对于new Date("{13 to 31}")

无效此外,从new Date("{32 to 49}")它认为是年份,对于两位数,它将添加当前世纪,即(2000 + 您指定的数字(,例如new Date("32")2032年,对于new Date("{50 to 99}"),它在上个世纪添加了,即(1900 +您指定的数字(,例如new Date("99")是"1999"年

对于三位数,直到"100000"以后,一年的输入非常简单,例如new Date("100")是100年,new Date("100000")100000年。其余的无效。

以上内容自今天起有效,而不是处理上述信息,始终建议在日期字段不存在的情况下使用 Null、NaN 和未定义值

最新更新