繁体   English   中英

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

[英]Why moment(date).isValid() returns wrong result

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

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 日期(值)构造函数规范
日期解析

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

所以它不符合"Date Time String Format" ,它要求字符串以 "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.DateTimeFormatDate.prototype.toLocaleString 一起使用
TL;DR 您现在使用它的方式意味着您实际上并不需要时间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM