如何以“格式”解析日期;YYYYmmdd“;用JavaScript?

如何以“格式”解析日期;YYYYmmdd“;用JavaScript?,javascript,date,Javascript,Date,这是一个noob问题: 如何在没有外部库的情况下解析格式为“YYYYmmdd”的日期?如果输入字符串不是这种格式,我希望得到无效日期(如果更容易,则为未定义) 用法: parse('20120401'); 更新: 正如Rocket所说,在js中,月份是以0为基础的……如果您的字符串中的月份不是以0为基础的,请使用此选项 function parse(str) { if(!/^(\d){8}$/.test(str)) return "invalid date"; var y =

这是一个noob问题:

如何在没有外部库的情况下解析格式为“YYYYmmdd”的日期?如果输入字符串不是这种格式,我希望得到
无效日期
(如果更容易,则为未定义)

用法:

parse('20120401');
更新:

正如Rocket所说,在js中,月份是以0为基础的……如果您的字符串中的月份不是以0为基础的,请使用此选项

function parse(str) {
    if(!/^(\d){8}$/.test(str)) return "invalid date";
    var y = str.substr(0,4),
        m = str.substr(4,2) - 1,
        d = str.substr(6,2);
    return new Date(y,m,d);
}
更新:

对日期的有效性进行更严格的检查。采用HBP的方式验证日期

function parse(str) {
    var y = str.substr(0,4),
        m = str.substr(4,2) - 1,
        d = str.substr(6,2);
    var D = new Date(y,m,d);
    return (D.getFullYear() == y && D.getMonth() == m && D.getDate() == d) ? D : 'invalid date';
}

验证数字的更可靠版本:

 function parse (str) {
        // validate year as 4 digits, month as 01-12, and day as 01-31 
        if ((str = str.match (/^(\d{4})(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])$/))) {
           // make a date
           str[0] = new Date (+str[1], +str[2] - 1, +str[3]);
           // check if month stayed the same (ie that day number is valid)
           if (str[0].getMonth () === +str[2] - 1)
              return str[0];
        }
        return undefined;
 }
请参阅小提琴:


我最近写了一个你可以在这里找到的功能更强的版本:

答案可能过于简单,没有检查,但速度很快

var date = parseInt(date);
new Date(date / 10000, date % 10000 / 100, date % 100);
或者,如果来源中的月份不是零

new Date(date / 10000, (date % 10000 / 100) - 1, date % 100);

将HBP的答案与此相结合,得到一个解析YYYYMMDDHHmm的函数,下面是一个


仅使用字符串中的数字的示例:

函数toDate(str){
var m=str.split(/\D/);
返回新日期(+m[0]、+m[1]-1、+m[2]、+m[3]、+m[4]、+m[5]);
}

控制台日志(toDate(“2020-08-23:34:45”)注意:在JavaScript中,月份是零索引的,所以您可能希望使用
新日期(y,m-1,d),否则
20120401
将是5月1日,而不是4月1日。如果输入是
0000550
?这是无效的字符串,但新日期('0000',50',50')
2009年6月9日星期二1903 00:00:00 GMT+0300(IDT)
好吧…接下来还有一个更新…如果你仍然有问题,一定要告诉他们,这样我可以改进这个答案…实际上我确实想到了这一点,但认为这可能是一个小问题,因此没有添加任何用于详细验证的代码…@ParthThakkar谢谢。但现在情况变得复杂了。我想知道是否有一个更简单的解决方案。好吧…另一个更新即将到来…这一次,我采用了HBP的方法来验证日期,更简单,更容易理解!向HBP投赞成票!很好,但是在解析失败时,它应该返回一个无效的日期,即
新日期(NaN)
。为此,将
返回未定义的
替换为
返回日期(NaN)
new Date(date / 10000, (date % 10000 / 100) - 1, date % 100);
var parseTS=function(str){
                // validate year as 4 digits, month as 01-12, and day as 01-31
                if ((str = str.match (/^(\d{4})(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])([0-5]\d)$/))) {
                    // make a date
                    str[0] = new Date (+str[1], +str[2] - 1, +str[3], +str[4], +str[5]);
                    // check if month stayed the same (ie that day number is valid)
                    if (str[0].getMonth () === +str[2] - 1) {
                        return str[0];
                    }
                }
                return undefined;
            };

    console.log(parseTS('201501012645'));