检查字符串是否为日期值2015年更新
检查值是否为有效日期(允许任何已知日期格式)的简单方法是什么。
例如,我有值 , 它们都应该被识别为日期值,而值 , , 不应该被识别为日期值。如果可能的话,最简单的检查方法是什么?因为时间戳也是允许的。10-11-2009
10/11/2009
2009-11-10T07:00:00+0000
200
10
350
检查值是否为有效日期(允许任何已知日期格式)的简单方法是什么。
例如,我有值 , 它们都应该被识别为日期值,而值 , , 不应该被识别为日期值。如果可能的话,最简单的检查方法是什么?因为时间戳也是允许的。10-11-2009
10/11/2009
2009-11-10T07:00:00+0000
200
10
350
这是一个老问题,但其他新问题,如:
作为这个的副本被关闭,所以我认为在这里添加一些新的信息很重要。我写它,因为我害怕人们实际上复制并粘贴了这里发布的一些代码,并将其用于生产。
这里的大多数答案要么使用一些复杂的正则表达式,只匹配一些非常特定的格式,但实际上做错了(比如匹配1月32日,而不匹配广告中的实际ISO日期 - 参见演示),要么他们试图将任何东西传递给构造函数并希望最好的。Date
正如我在这个答案中解释的那样,目前有一个库可用于此:Moment.js
它是一个在JavaScript中解析,验证,操作和显示日期的库,它具有比标准JavaScript日期处理函数更丰富的API。
它是12kB缩小/gziped的,可以在Node.js和其他地方工作:
bower install moment --save # bower
npm install moment --save # npm
Install-Package Moment.js # NuGet
spm install moment --save # spm
meteor add momentjs:moment # meteor
使用Moment,您可以非常具体地检查有效日期。有时,添加一些有关您期望的格式的线索非常重要。例如,像 06/22/2015 这样的日期看起来像一个有效的日期,除非您使用 DD/MM/YYYY 格式,在这种情况下,此日期应被拒绝为无效。有几种方法可以告诉Moment你期望的格式,例如:
moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false
真正的
参数就在那里,所以如果Moment不完全符合所提供的格式之一,那么Moment就不会尝试解析输入(在我看来,这应该是默认行为)。
您可以使用内部提供的格式:
moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true
您可以使用多种格式作为数组:
var formats = [
moment.ISO_8601,
"MM/DD/YYYY :) HH*mm*ss"
];
moment("2015-06-22T13:17:21+0000", formats, true).isValid(); // true
moment("06/22/2015 :) 13*17*21", formats, true).isValid(); // true
moment("06/22/2015 :( 13*17*21", formats, true).isValid(); // false
请参见:演示。
如果您不想使用Moment.js,还有其他库:
我创建了一个immoment模块,它类似于Moment的(子集),但没有由现有对象的突变引起的意外(有关更多信息,请参阅文档)。
今天,我建议使用Luxon进行日期/时间操作,而不是Moment,这(与Moment不同)使所有对象不可变,因此没有与日期隐式突变相关的令人讨厌的惊喜。
另请参阅:
Rob Gravelle 关于 JavaScript 日期解析库的一系列文章:
当然,任何人都可以尝试重新发明轮子,编写正则表达式(但在执行此操作之前请实际阅读ISO 8601和RFC 3339)或使用随机数据调用buit-in构造函数来解析错误消息,例如(您确定此消息在所有平台上都完全相同吗?在所有地区?将来?或者你可以使用一个经过测试的解决方案,并利用你的时间来改进它,而不是重新发明它。这里列出的所有库都是开源的免费软件。'Invalid Date'
这就是我在目前正在开发的应用程序中解决此问题的方式:
根据Krillgar的反馈进行了更新:
var isDate = function(date) {
return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}