检查字符串是否为日期值2015年更新

2022-08-30 00:12:26

检查值是否为有效日期(允许任何已知日期格式)的简单方法是什么。

例如,我有值 , 它们都应该被识别为日期值,而值 , , 不应该被识别为日期值。如果可能的话,最简单的检查方法是什么?因为时间戳也是允许的。10-11-200910/11/20092009-11-10T07:00:00+000020010350


答案 1

2015年更新

这是一个老问题,但其他新问题,如:

作为这个的副本被关闭,所以我认为在这里添加一些新的信息很重要。我写它,因为我害怕人们实际上复制并粘贴了这里发布的一些代码,并将其用于生产。

这里的大多数答案要么使用一些复杂的正则表达式,只匹配一些非常特定的格式,但实际上做错了(比如匹配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,还有其他库:

2016年更新

我创建了一个immoment模块,它类似于Moment的(子集),但没有由现有对象的突变引起的意外(有关更多信息,请参阅文档)。

2018年更新

今天,我建议使用Luxon进行日期/时间操作,而不是Moment,这(与Moment不同)使所有对象不可变,因此没有与日期隐式突变相关的令人讨厌的惊喜。

更多信息

另请参阅:

Rob Gravelle 关于 JavaScript 日期解析库的一系列文章:

底线

当然,任何人都可以尝试重新发明轮子,编写正则表达式(但在执行此操作之前实际阅读ISO 8601和RFC 3339)或使用随机数据调用buit-in构造函数来解析错误消息,例如(您确定此消息在所有平台上都完全相同吗?在所有地区?将来?或者你可以使用一个经过测试的解决方案,并利用你的时间来改进它,而不是重新发明它。这里列出的所有库都是开源的免费软件。'Invalid Date'


答案 2

这就是我在目前正在开发的应用程序中解决此问题的方式:

根据Krillgar的反馈进行了更新:

var isDate = function(date) {
    return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}