如何在JavaScript中以"YYYYmmdd"格式解析日期?

Mic*_*ael 17 javascript date

这是一个菜鸟问题:

如何在"YYYYmmdd"没有外部库的情况下解析格式化日期?如果输入字符串不是这种格式,我想得到invalid Date(或者如果它更容易,则不定义).

Par*_*kar 30

function parse(str) {
    if(!/^(\d){8}$/.test(str)) return "invalid date";
    var y = str.substr(0,4),
        m = str.substr(4,2),
        d = str.substr(6,2);
    return new Date(y,m,d);
}
Run Code Online (Sandbox Code Playgroud)

用法:

parse('20120401');
Run Code Online (Sandbox Code Playgroud)

更新:

正如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);
}
Run Code Online (Sandbox Code Playgroud)

更新:

更严格地检查日期的有效性.采用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';
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:在JavaScript中,月份是零索引的,所以你可能想要使用`new Date(y,m-1,d);`,否则`20120401`将是5月1日,而不是4月1日. (2认同)

HBP*_*HBP 5

一个更健壮的版本验证数字:

 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;
 }
Run Code Online (Sandbox Code Playgroud)

请参阅:http://jsfiddle.net/jstoolsmith/zJ7dM/

我最近在这里写了一个功能更强大的版本:http://jsfiddle.net/jstoolsmith/Db3JM/