日期时间格式转换

2,564 阅读1分钟

使用场景

  • 后台传过来的时间格式不正确 但是我们需要在页面上展示 'yyyy-MM-dd hh-mm-ss' 类似的时间格式

  • 前端在某些场景下需要获取 'yyyy-MM-dd hh-mm-ss' 形式格式的时间,不可能每次用到的时候都去写一遍,这样耦合性太高。

代码实现

 /**
 * 日期时间格式转换
 * @param {String || Number} dateStr  "1995-12-17T03:24:00" || 1605592704154
 * @param {String} format  "yyyy-MM-dd hh:mm:ss"
 * @returns "2020-05-29 12:32:12"
 */
     function getFormatDate(dateStr = null, format = "yyyy-MM-dd hh:mm:ss") {
        const date = new Date(
          typeof dateStr === "number" ? dateStr : Number(dateStr)
        );
        const o = {
          "M+": date.getMonth() + 1, //month
          "d+": date.getDate(), //day
          "h+": date.getHours(), //hour
          "m+": date.getMinutes(), //minute
          "s+": date.getSeconds(), //second
          "q+": Math.floor((date.getMonth() + 3) / 3), //quarter(季度)
          S: date.getMilliseconds() //millisecond
        };

        if (/(y+)/.test(format)) {
          const m = RegExp.$1; // yyyy
          format = format.replace( //匹配年份
            m,
            (date.getFullYear() + "").substr(4 - m.length) //从末尾截取
            /* 1. substr(start, num) 从start 开始截取num 位
             * 2. substring(start, end) 从start 开始截取到end  start 取得到,end 取不到
             */
          );
        }
        for (let k in o) {
          if (new RegExp(`(${k})`).test(format)) {
            // console.log(RegExp.$1); MM dd hh mm ss
            format = format.replace( //匹配月、日、时分秒
              RegExp.$1,
              RegExp.$1.length == 1
                ? o[k]
                : ("00" + o[k]).substr(("" + o[k]).length) 
                // 拼接 '00' 的目的是如果当前月份、天数、小时...是小于10的话, 拼接成 '01'的形式
                ('' + o[k]).padStart(2, '0') 也可实现
            );
          }
        }

        return format;
      }