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

时间:2020-06-13 11:53:13

标签: javascript momentjs

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

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
{ }

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

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

ECMA-262 Date(value) constructor specs
Date.parse

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

因此它与"Date Time String Format"不兼容,后者要求字符串以“ YYYY”开头,因此将转到特定于实现的解析过程,该解析过程类似于上述规则,但使用的格式为:“ MM- DD-YYYY”。

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

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.DateTimeFormatDate.prototype.toLocaleString结合使用。
TL; DR现在使用的方式意味着您实际上不需要片刻