使用 moment.js 验证 ISO 8601 日期

26

我正在尝试使用moment.js在javascript中验证ISO 8601日期。

console.log(moment("2011-10-10T14:48:00", "YYYY-MM-DD", true).isValid())

它返回false。我错在哪里?日期类型格式不正确吗?

版本:Moment 2.5.1


不是,它返回“true”。http://jsfiddle.net/praveen_jegan/r42jg/49/ - Praveen
嗯,我正在使用Moment 2.5.1,但我得到了false。请检查plnk - http://plnkr.co/edit/umqpqkqOgfRNeh5Gcafw?p=preview - user1184100
1
谢谢你的回答并撤销了负评,对于没有仔细阅读文档我深表歉意 :) - user1184100
FYI,Moment目前还不支持基本的ISO字符串(例如20111010),但计划在未来提供支持 - https://github.com/moment/moment/issues/2025 - sync
4个回答

71

为了避免使用字符串模式作为第二个参数,您可以直接调用:

moment("2011-10-10T14:48:00", moment.ISO_8601).isValid() // true
moment("2016-10-13T08:35:47.510Z", moment.ISO_8601).isValid() // true

12
您可以尝试使用moment("1466113", moment.ISO_8601, true).isValid()来验证避免使用字符串模式不一定适用于所有情况。 - WhiteKnight
根据Wikipedia所述,YYYYMMDD是一个有效的ISO8601日期格式。如果您只想使用连字符来格式化日期,则实际上只是针对ISO8601的一个子集。 - Daniel Cheung

17

不确定为什么 Praveen 在 jsfiddle 中的示例可以工作,但您的示例之所以无法工作是因为格式不是 YYYY-MM-DD。它还包括时间,因此被视为无效。如果您在日期中不使用时间,则返回 true。

请尝试使用以下内容:
moment("2011-10-10T14:48:00", "YYYY-MM-DDTHH:mm:ss", true).isValid()


5

好的,我找到了。

根据文档

从2.3.0版本开始,您可以为最后一个参数指定一个布尔值,以使Moment使用严格解析。 严格解析要求格式和输入完全匹配。

因为您使用了严格操作,它返回false。 为了克服这个问题,请使用以下代码:

alert(moment("2011-10-10T14:48:00", "YYYY-MM-DDTHH:mm:ss", true).isValid())
//This will return true

演示1

如果您取消严格解析

alert(moment("2011-10-10T14:48:00", "YYYY-MM-DD").isValid())
//This will return true

demo2


这段代码返回true,但我期望它是false。alert(moment("6205122", "YYYY-MM-DDTHH:mm:ss, true").isValid()) - sawe
第一个 jsfiddle 中有一个错别字: alert(moment("2011-10-10T14:48:00", "YYYY-MM-DDTHH:mm:ss, true").isValid())双引号应该在逗号之前,也就是 true 之前。 - Nick

1
使用此代码匹配日期的部分。
console.log(moment("2011-10-10T14:48:00", "YYYY-MM-DD", false).isValid())

如果您想完全匹配格式,请使用以下代码:
console.log(moment("2011-10-10T14:48:00", "YYYY-MM-DDTHH:mm:ss", true).isValid())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接