21

这是一个菜鸟问题:

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

4

6 回答 6

36
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);
}

用法:

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';
}
于 2012-05-17T15:22:20.567 回答
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;
 }

参见小提琴:http: //jsfiddle.net/jstoolsmith/zJ7dM/

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

于 2012-05-17T15:45:24.570 回答
4

可能是简单的答案,没有检查,但很快......

var date = parseInt(date);
new Date(date / 10000, date % 10000 / 100, date % 100);

或者,如果基于源的月份不为零,

new Date(date / 10000, (date % 10000 / 100) - 1, date % 100);
于 2014-11-12T02:01:54.367 回答
0

结合 HBP 的答案和这个答案来获得一个解析 YYYYMMDDHHmm 的函数,这是一个小提琴

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'));
于 2015-03-05T09:35:13.677 回答
0

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

function toDate(str) {
  var m = str.split(/\D/);
  return new Date(+m[0], +m[1] - 1, +m[2], +m[3], +m[4], +m[5]);
}
    
console.log(toDate("2020-08-23 23:34:45"));

于 2020-08-11T21:30:35.750 回答
0

使用更新的语言特性来解构赋值:

// Parse YYYYMMDD to Date
function parseYMD(s) {
  let [C,Y,M,D] = s.match(/\d\d/g);
  return new Date(C+Y, M-1, D);
}

['20211125', // Valid date
 '2021112',  // Invalid input
 '20219999'  // Invalid date components
].forEach(d => 
  console.log(`${d} -> ${parseYMD(d).toDateString()}`)
);

请注意,这不会验证日期组件,任何 8 位或更多位的字符串都会生成有效的日期。其他任何事情都会产生无效的日期。如果需要严格解析,请考虑:

// Parse YYYYMMDD to Date. If any part is out of
// range, return an invalid Date.
function parseYMD(s) {
  let [C,Y,M,D] = s.match(/\d\d/g);
  let d = new Date(C+Y, M-1, D);
  let [yr,mo,da] = d.toLocaleDateString('en-CA').split(/\D/); 
  if (yr != C+Y || mo != M || da != D) {
    d.setTime(NaN);
  }
  return d;
}

['20211125', // Valid date
 '2021112',  // Invalid input
 '20219999'  // Invalid date components
].forEach(d => 
  console.log(`${d} -> ${parseYMD(d).toDateString()}`)
);

于 2021-11-25T12:06:45.950 回答