【问题标题】:How to parse a date in format "YYYYmmdd" in JavaScript?如何在 JavaScript 中解析格式为“YYYYmmdd”的日期?
【发布时间】:2023-03-15 00:41:01
【问题描述】:

这是一个菜鸟问题:

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

【问题讨论】:

标签: javascript date


【解决方案1】:
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';
}

【讨论】:

  • 注意:在 JavaScript 中,月份是从零开始索引的,因此您可能需要使用 new Date(y, m-1, d);,否则 20120401 将是 5 月 1 日,而不是 4 月 1 日。
  • 如果输入的是00005050怎么办?它是无效字符串,但 new Date('0000', '50', 50')Tue Jun 09 1903 00:00:00 GMT+0300 (IDT)
  • 好吧......还有一个更新即将到来......如果你仍然有问题,请告诉他们,以便我可以改进这个答案......实际上我确实想到了这个,但是想到了这个可能是一个微不足道的案例,因此没有为 detailed 验证添加任何代码...
  • @ParthThakkar 谢谢。然而现在它变得复杂了。我想知道是否有更简单的解决方案。
  • 好吧……又要更新了……这一次,我采用了HBP的方法来验证日期,更简单,更容易理解!为 HBP 点个赞!
【解决方案2】:

验证数字的更强大的版本:

 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/

【讨论】:

  • 很好,但不是在解析失败的地方返回 undefined,它应该返回一个无效的日期,即new Date(NaN)
  • 为此,请将return undefined 替换为return date(NaN)
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

    结合 HBP 的答案和这个 answer 得到一个解析 YYYYMMDDHHmm 的函数,这里是一个 fiddle

    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'));
    

    【讨论】:

      【解决方案5】:

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

      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"));

      【讨论】:

        【解决方案6】:

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

        // 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()}`)
        );

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-16
          • 2021-02-27
          • 2018-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-26
          相关资源
          最近更新 更多