it-swarm.cn

检查字符串是否为日期值

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

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

159
Thys

Date.parse()足够吗?

查看其相关 MDN文档页面

34
Asmor

2015年更新

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

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

这里的大多数答案都是或者使用一些复杂的正则表达式,它们只匹配一些非常特定的格式并且实际上做得不正确(比如匹配1月32日,而不像广告中那样匹配实际的ISO日期 - 请参阅 演示他们试图将任何东西传递给Date构造函数并希望最好。

使用时刻

正如我在 这个答案中解释的那样 目前有一个可用的库: Moment.js

它是一个用JavaScript解析,验证,操作和显示日期的库,它具有比标准JavaScript日期处理函数更丰富的API。

它是12kB缩小/ gzip并在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,您可以非常具体地检查有效日期。有时候添加一些关于你期望的格式的线索是非常重要的。例如,2015年6月22日之类的日期看起来像一个有效的日期,除非您使用格式DD/MM/YYYY,在这种情况下,该日期应被视为无效。您可以通过几种方式告诉Moment您期望的格式,例如:

moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false

true参数是存在的,所以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

请参阅: DEMO

其他图书馆

如果您不想使用Moment.js,还有其他库:

2016年更新

我创建了 immoment 模块,它就像(一部分)Moment但没有因现有对象的变异而引起的惊喜(参见 文档 了解更多信息)。

2018年更新

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

更多信息

也可以看看:

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

底线

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

199
rsp

这就是我现在正在处理的应用程序中解决这个问题的方法:

根据krillgar的反馈更新:

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

要么...

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

....

52
Neil Girardi

new Date(date) === 'Invalid Date'仅适用于Firefox和Chrome。 IE8(我在我的机器上用于测试目的)给出了NaN。

正如已接受的答案所述,Date.parse(date)也适用于数字。因此,为了解决这个问题,你还可以检查它不是一个数字(如果这是你要确认的东西)。

var parsedDate = Date.parse(date);

// You want to check again for !isNaN(parsedDate) here because Dates can be converted
// to numbers, but a failed Date parse will not.
if (isNaN(date) && !isNaN(parsedDate)) {
    /* do your work */
}
19
krillgar

这样的事怎么样?它将测试它是Date对象还是日期字符串:

function isDate(value) {
    var dateFormat;
    if (toString.call(value) === '[object Date]') {
        return true;
    }
    if (typeof value.replace === 'function') {
        value.replace(/^\s+|\s+$/gm, '');
    }
    dateFormat = /(^\d{1,4}[\.|\\/|-]\d{1,2}[\.|\\/|-]\d{1,4})(\s*(?:0?[1-9]:[0-5]|1(?=[012])\d:[0-5])\d\s*[ap]m)?$/;
    return dateFormat.test(value);
}

我应该提一下,这不会测试ISO格式化的字符串,但是对RegExp做更多的工作你应该是好的。

8
jwerre

这里的答案都没有解决检查日期是否无效的问题,例如2月31日。此功能通过检查返回的月份是否等于原始月份并确保提供有效年份来解决该问题。

//expected input dd/mm/yyyy or dd.mm.yyyy or dd-mm-yyyy
function isValidDate(s) {
  var separators = ['\\.', '\\-', '\\/'];
  var bits = s.split(new RegExp(separators.join('|'), 'g'));
  var d = new Date(bits[2], bits[1] - 1, bits[0]);
  return d.getFullYear() == bits[2] && d.getMonth() + 1 == bits[1];
} 
6
ykay

我会这样做的

var myDateStr= new Date("2015/5/2");

if( ! isNaN ( myDateStr.getMonth() )) {
    console.log("Valid date");
}
else {
    console.log("Invalid date");
}

播放 这里

3
kiranvj

使用正则表达式来验证它。

isDate('2018-08-01T18:30:00.000Z');

isDate(_date){
        const _regExp  = new RegExp('^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$');
        return _regExp.test(_date);
    }
2
lpradhap

通过参考上述所有评论,我找到了解决方案。

如果传递的日期是ISO格式或需要操作其他格式,则此方法有效。

var isISO = "2018-08-01T18:30:00.000Z";

if(new Date(isISO) !== "Invalid Date" && !isNaN(new Date(isISO)) ) {
if(isISO==new Date(isISO).toISOString()){
console.log("Valid date");
} else {
    console.log("Invalid date");
    }

}
else {
    console.log("Invalid date");
}`

你可以玩 这里 JSFiddle

2
Nikhil Zurunge

这是一个极简主义版本。

var isDate = function (date) {
    return!!(function(d){return(d!=='Invalid Date'&&!isNaN(d))})(new Date(date));
}
2
Mr. Polywhirl

可以使用以下答案验证日期

 var year=2019;
 var month=2;
 var date=31;
 var d = new Date(year, month - 1, date);
 if (d.getFullYear() != year
    || d.getMonth() != (month - 1)
    || d.getDate() != date) {
alert("invalid date");
return false;
}
1
Krishnamoorthy Acharya

此可调用函数完美运行,对于有效日期返回true。务必使用ISO格式的日期(yyyy-mm-dd或yyyy/mm/dd)进行呼叫:

function validateDate(isoDate) {

    if (isNaN(Date.parse(isoDate))) {
        return false;
    } else {
        if (isoDate != (new Date(isoDate)).toISOString().substr(0,10)) {
            return false;
        }
    }
    return true;
}
1
Peter DK

我知道这是一个老问题,但我遇到了同样的问题,并且看到没有一个答案正常工作 - 特别是从日期中删除数字(1,200,345等等),这是最初的问题。这是一个我能想到的相当不正统的方法,似乎有效。请指出是否存在失败的情况。

if(sDate.toString() == parseInt(sDate).toString()) return false;

这是排除数字的线。因此,整个功能可能如下所示:

function isDate(sDate) {  
  if(sDate.toString() == parseInt(sDate).toString()) return false; 
  var tryDate = new Date(sDate);
  return (tryDate && tryDate.toString() != "NaN" && tryDate != "Invalid Date");  
}

console.log("100", isDate(100));
console.log("234", isDate("234"));
console.log("hello", isDate("hello"));
console.log("25 Feb 2018", isDate("25 Feb 2018"));
console.log("2009-11-10T07:00:00+0000", isDate("2009-11-10T07:00:00+0000"));
0
peekolo

在尝试了上面列出的所有答案后,我得到了以下结果:

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

请注意new Date(date) !== "Invalid Date" always true。希望这可以帮助。

0
dyatchenko

这就是我最终做到这一点的方式。这不会涵盖所有格式。你必须相应调整。我控制了格式,所以它对我有用

function isValidDate(s) {
            var dt = "";
            var bits = [];
            if (s && s.length >= 6) {
                if (s.indexOf("/") > -1) {
                    bits = s.split("/");
                }
                else if (s.indexOf("-") > -1) {
                    bits = s.split("-");
                }
                else if (s.indexOf(".") > -1) {
                    bits = s.split(".");
                }
                try {
                    dt = new Date(bits[2], bits[0] - 1, bits[1]);
                } catch (e) {
                    return false;
                }
                return (dt.getMonth() + 1) === parseInt(bits[0]);
            } else {
                return false;
            }
        }
0
kheya

试试这个

<input type="text" id="StartDay" value="2018/01/01" maxlength="10" />

$('#StartDay').change(function () {
    if ( ($('#StartDay').val().length == 10 && new Date($('#StartDay').val()) >= new Date("2018/01/01") &&
        (new Date($('#StartDay').val()) !== "Invalid Date") && !isNaN(new Date($('#StartDay').val()))) == false) {
     .....
    }
})
0
Willie Cheng

是否可以检查Date相关函数是否可供对象查找是否为Date对象?

喜欢

var l = new Date();
var isDate = (l.getDate !== undefined) ? true; false;
0
Kishore Relangi