项目常用JS方法封装(二) [ 时间相关处理 ]

5,097 阅读4分钟

持续更新中...

封装方法传送门:


使用方法非常简单,只需放到你的 utils.js 工具文件中,直接 export const 加上我的封装方法,在别的文件中使用{方法1,方法2,方法3...}引用后就可以直接使用了!

001.时间戳转化成YMD格式

let date = Date.parse(new Date()) //  获取当前时间戳(毫秒)

/*
*   timestamp 当前时间戳,毫秒
*   formats 时间格式,包括:
*               1. Y-m-d
*               2. Y-m-d H:i:s
*               3. Y年m月d日
*               4. Y年m月d日 H时i分s秒
*/

dateFormat = (timestamp, formats) => {
    formats = formats || 'Y-m-d';
    let zero = v => v < 10 ? `0${v}` : v
    let myDate = timestamp ? new Date(timestamp) : new Date();
    let year = myDate.getFullYear();
    let month = zero(myDate.getMonth() + 1);
    let day = zero(myDate.getDate());
    let hour = zero(myDate.getHours());
    let minute = zero(myDate.getMinutes());
    let second = zero(myDate.getSeconds());

    return formats.replace(/Y|m|d|H|i|s/ig, matches => {
        return ({
            Y: year,
            m: month,
            d: day,
            H: hour,
            i: minute,
            s: second
        })[matches];
    });
};

console.log(dateFormat(date,'Y-m-d'));

002.年

let date = Date.parse(new Date()) //  获取当前时间戳(毫秒)

dateY = time =>{
  let newDate = new Date(time);
  let {y}={y:newDate.getFullYear()};
  return `${y}`;
}

console.log(dateY(date));

003.年月

let date = Date.parse(new Date()) //  获取当前时间戳(毫秒)

dateYM = time => {
  let newDate = new Date(time);
  let { y, m, d } = { y: newDate.getFullYear(), m: newDate.getMonth() + 1, d: newDate.getDate() };
  return `${y}-${m}`;
}

console.log(dateYM(date));

004.年月日

可根据自己需求,自己添加或删除相应的时间

let date = Date.parse(new Date()) //  获取当前时间戳(毫秒)

dateymd = time => {
  let newDate = new Date(time);
  let { y, m, d } = { y: newDate.getFullYear(), m: newDate.getMonth() + 1, d: newDate.getDate() };
  return `${y}-${m}-${d}`;
}

console.log(dateymd2(date));

005.年月日时分秒

let date = Date.parse(new Date()) //  获取当前时间戳(毫秒)

dateTime = time => {
  let newDate = new Date(time);
  let { y, M, d, h, m, s } = { y: newDate.getFullYear(), M: newDate.getMonth() + 1, d: newDate.getDate(), h: newDate.getHours(), m: newDate.getMinutes(), s: newDate.getSeconds() };
  return `${y}-${M}-${d}  ${h}:${m}:${s}`;
}

console.log(dateTime(date));

006.计算时间N之前

time_filter = time => {
  time -= 0;
  let difTime = new Date().getTime() - time;
  let { h, m, s } = { h: parseInt(difTime / (3600 * 1000)), m: parseInt(difTime / (60 * 1000)), s: parseInt(difTime / 1000) };
  let msg = "";
  if (m < 1) {
    msg = `${s}秒前`
  } else if (m >= 1 && h < 1) {
    msg = `${m}分钟前`;
  } else if (h >= 1 && h <= 24) {
    msg = `${h}小时前`;
  } else if (h > 24) {
    h = parseInt(h / 24)
    msg = `${h}天前`;
  }
  return msg;
}

//输入一个时间戳,能计算出来是多长时间之前
console.log(time_filter(1584009520000));  //3分钟前

007.获取上周本周下周时间

getDate = n => {
  let now = new Date();
  let year = now.getFullYear();
  let month = now.getMonth() + 1;
  let date = now.getDate();
  let day = now.getDay();
  if (day !== 0) {
    n = n + (day - 1);
  } else {
    n = n + day;
  }
  if (day) {
    if (month > 1) {
      month = month;
    } else {
      year = year - 1;
      month = 12;
    }
  }
  now.setDate(now.getDate() - n);
  year = now.getFullYear();
  month = now.getMonth() + 1;
  date = now.getDate();
  let s =
    year +
    "-" +
    (month < 10 ? "0" + month : month) +
    "-" +
    (date < 10 ? "0" + date : date);
  return s;
}

/***参数都是以周一为基准的***/
//上周的开始时间
// console.log(getDate(7));
//上周的结束时间
// console.log(getDate(1));
//本周的开始时间
// console.log(getDate(0));
//本周的结束时间
// console.log(getDate(-6));
//下周的开始时间
// console.log(getDate(-7));
//下周结束时间
// console.log(getDate(-13));

008.获取当前时间(年月日)

getNowDate = () => {
  let nowdate = new Date();
  let y = nowdate.getFullYear();
  let m = nowdate.getMonth() + 1;
  let d = nowdate.getDate();
  return y + "-" + m + "-" + d;
}

009.获取当前时间(年月日时分秒)

/**
 * @return {String} 返回一个格式为'yyyy-mm-dd HH:mm:ss'的字符串
 */
getDateTime = () => {
    let d, s
    d = new Date()
    let addZero = value => { return value < 10 ? `0${value}` : value }
    s = `${d.getFullYear()}-`
    s = `${s}${addZero(d.getMonth() + 1)}-`
    s += `${addZero(d.getDate())} `
    s += `${addZero(d.getHours())}:`
    s += `${addZero(d.getMinutes())}:`
    s += `${addZero(d.getSeconds())}`
    return s
}

console.log(getDateTime());

010.倒计时(开始结束重置,自定义时间)

以下代码写到HTML的body中

<span id="clock">00:01:00:00</span>
<input id="start" type="button" value="开始" onclick="run()">
<input id="end" type="button" value="结束" onclick="stop()">
<input id="reset" type="button" value="重置" onclick="reset()">
<script language="Javascript">
    var normalelapse = 100;
    var nextelapse = normalelapse;
    var counter;
    var startTime;
    var start = clock.innerText;
    var defaultTime = clock.innerText;
    var finish = "00:00:00:00";
    var timer = null;

    // 开始运行  
    function run() {
        start.disabled = true;
        end.disabled = false;
        reset.disabled = false;
        counter = 0;
        // 初始化开始时间  
        startTime = new Date().valueOf();

        // nextelapse是定时时间, 初始时为100毫秒  
        // 注意setInterval函数: 时间逝去nextelapse(毫秒)后, onTimer才开始执行  
        timer = window.setInterval("onTimer()", nextelapse);
    }

    // 停止运行  
    function stop() {
        start.disabled = false;
        end.disabled = true;
        reset.disabled = true;
        window.clearTimeout(timer);
    }
    window.onload = function () {
        end.disabled = true;
    };

    // 重置时间
    function reset() {
        start.disabled = true;
        end.disabled = false;
        reset.disabled = false;
        window.clearTimeout(timer);
        clock.innerText = defaultTime
    }

    // 倒计时函数  
    function onTimer() {
        if (start == finish) {
            window.clearInterval(timer);
            alert("时间到了!");
            return;
        }

        var hms = new String(start).split(":");
        var ms = new Number(hms[3]);
        var s = new Number(hms[2]);
        var m = new Number(hms[1]);
        var h = new Number(hms[0]);

        ms -= 10;
        if (ms < 0) {
            ms = 90;
            s -= 1;
            if (s < 0) {
                s = 59;
                m -= 1;
            }

            if (m < 0) {
                m = 59;
                h -= 1;
            }
        }

        var ms = ms < 10 ? ("0" + ms) : ms;
        var ss = s < 10 ? ("0" + s) : s;
        var sm = m < 10 ? ("0" + m) : m;
        var sh = h < 10 ? ("0" + h) : h;

        start = sh + ":" + sm + ":" + ss + ":" + ms;
        clock.innerText = start;

        // 清除上一次的定时器  
        window.clearInterval(timer);

        // 自校验系统时间得到时间差, 并由此得到下次所启动的新定时器的时间nextelapse  
        counter++;
        var counterSecs = counter * 100;
        var elapseSecs = new Date().valueOf() - startTime;
        var diffSecs = counterSecs - elapseSecs;
        nextelapse = normalelapse + diffSecs;
        if (nextelapse < 0) nextelapse = 0;
        // 启动新的定时器  
        timer = window.setInterval("onTimer()", nextelapse);
    }  
</script>

011.计时器(无开始结束)

以下代码写到HTML的body中

<div id="time"></div>
<script type="text/javascript">
    var maxtime = 10 * 60; // 
    function CountDown() {
        if (maxtime >= 0) {
            minutes = Math.floor(maxtime / 60);
            seconds = Math.floor(maxtime % 60);
            msg = "还有" + minutes + "分" + seconds + "秒";
            document.all["time"].innerHTML = msg;
            if (maxtime == 5 * 60) alert("仅剩5分钟");
            --maxtime;
        } else {
            clearInterval(timer);
            alert("时间到!");
        }
    }
    timer = setInterval("CountDown()", 1000);   
</script>

012.获取最近一周(月),下一周(月)日期范围

使用时要注意函数之间的相互引用和this指向问题

/*
 * @param dateNow :Date类
 * @param intervalDays :间隔天数
 * @param bolPastTime  :Boolean,判断在参数date之前,还是之后,
 */
getDateRange = (dateNow, intervalDays, bolPastTime) => {
    let formateDate = time => {
        let year = time.getFullYear()
        let month = time.getMonth() + 1
        let day = time.getDate()
        if (month < 10) { month = `0${month}` }
        if (day < 10) { day = `0${day}` }
        return `${year}-${month}-${day}`
    }
    let oneDayTime = 24 * 60 * 60 * 1000
    let list = []
    let lastDay
    if (bolPastTime) {
        lastDay = new Date(dateNow.getTime() - intervalDays * oneDayTime)
        list.push(formateDate(lastDay))
        list.push(formateDate(dateNow))
    } 
    if(!bolPastTime) {
        lastDay = new Date(dateNow.getTime() + intervalDays * oneDayTime)
        list.push(formateDate(dateNow))
        list.push(formateDate(lastDay))
    }
    return list
}

let date = new Date();
let list = getDateRange(date, 6, true)
console.log("获取近一周日期范围:\n开始日期:" + list[0] + ";结束日期:" + list[1]);

let list = getDateRange(date, 30, true)
console.log("获取近一个月日期范围:\n开始日期:" + list[0] + ";结束日期:" + list[1]);

let list = getDateRange(date, 0, true)
console.log("获取今天日期范围:\n开始日期:" + list[0] + ";结束日期:" + list[1]);

let list = getDateRange(date, 1, true)
console.log("获取昨天日期范围:\n开始日期:" + list[0] + ";结束日期:" + list[0]);

let list = getDateRange(date, 6, false)
console.log("获取下一周日期范围:\n开始日期:" + list[0] + ";结束日期:" + list[1]);

let list = getDateRange(date, 30, false)
console.log("获取下一个月日期范围:\n开始日期:" + list[0] + ";结束日期:" + list[1]);

/*
获取近一周日期范围:
开始日期:2019-12-04;结束日期:2019-12-10

获取近一个月日期范围:
开始日期:2019-11-10;结束日期:2019-12-10

获取今天日期范围:
开始日期:2019-12-10;结束日期:2019-12-10

获取昨天日期范围:
开始日期:2019-12-09;结束日期:2019-12-09

获取下一周日期范围:
开始日期:2019-12-10;结束日期:2019-12-16

获取下一个月日期范围:
开始日期:2019-12-10;结束日期:2020-01-09
*/

013.字符替换(时间格式)

/*
*   str 表示将要替换的字符串
*   l 表示你将要替换的字符
*   r 表示你想要替换的字符
*/
transFormat = (str, l, r) => {
    let reg = new RegExp(l, 'g') // g表示全部替换,默认替换第一个
    str = str.replace(reg, r)
    return str
}

console.log(transFormat('2019-12-13', '-', '/')); // 2019/12/13
console.log(transFormat('2019-12-13', '-', '')); // 20191213

014.时间补零

如果获取的时间是一位数,则补一个0

Appendzero = obj => {
    return obj < 10 ? `0${obj}` : obj
}

015.获取当前时间半小时之前时间

getHalfHour = () => {
  let date = new Date(new Date().getTime() - 30 * 60 * 1000);
  let hh = date.getHours()
  let mm = date.getMinutes()
  let ss = date.getSeconds()
  return hh + ':' + mm + ':' + ss
}

有可能我们在使用时间数据时,需要使用到的时间必须是两位数,这时候,我们只需要使用上面的时间补零方法,就可以完美的解决了,如下:

getHalfHour = () => {
  let date = new Date(new Date().getTime() - 30 * 60 * 1000);
  let hh = Appendzero(date.getHours())
  let mm = Appendzero(date.getMinutes())
  let ss = Appendzero(date.getSeconds())
  return hh + ':' + mm + ':' + ss
}

function Appendzero(obj) {
  return obj < 10 ? `0${obj}` : obj
}

下面紧接着的这两种方法类似!!!

016.获取当前时间1小时之前时间

getOneHour = () => {
  let date = new Date(new Date().getTime() - 1 * 60 * 60 * 1000);
  let hh = date.getHours()
  let mm = date.getMinutes()
  let ss = date.getSeconds()
  return hh + ':' + mm + ':' + ss
}

017.获取当前时间12小时之前时间

getHalfHour = () => {
  let date = new Date(new Date().getTime() - 30 * 60 * 1000);
  let hh = date.getHours()
  let mm = date.getMinutes()
  let ss = date.getSeconds()
  return hh + ':' + mm + ':' + ss
}

018.数字前补零

/*
*   num为你想要进行填充的数字
*   length为你想要的数字长度
*/

//迭代方式实现
padding1=(num, length)=> {
  for(let len = (num + "").length; len < length; len = num.length) {
      num = "0" + num;            
  }
  return num;
}

//递归方式实现
padding2=(num, length) =>{
  if((num + "").length >= length) {
      return num;
  }
  return padding2("0" + num, length)
}

//转为小数
padding3=(num, length)=> {
  let decimal = num / Math.pow(10, length);
  //toFixed指定保留几位小数
  decimal = decimal.toFixed(length) + "";
  return decimal.substr(decimal.indexOf(".")+1);
}

//填充截取法
padding4=(num, length)=> {
  //这里用slice和substr均可
  return (Array(length).join("0") + num).slice(-length);
}

//填充截取法
padding5=(num, length)=> {
  let len = (num + "").length;
  let diff = length+1 - len;
  if(diff > 0) {
      return Array(diff).join("0") + num;
  }
  return num;
}

019.UTC转换标准时间

utcToNorm = utcTime => {
  // 转为正常的时间格式 年-月-日 时:分:秒
  let T_pos = utcTime.indexOf('T');
  let Z_pos = utcTime.indexOf('Z');
  let year_month_day = utcTime.substr(0, T_pos);
  let hour_minute_second = utcTime.substr(T_pos + 1, Z_pos - T_pos - 1);
  let newTime = year_month_day + " " + hour_minute_second;
  // 处理成为时间戳
  timeStamp = new Date(Date.parse(newTime));
  timeStamp = timeStamp.getTime();
  timeStamp = timeStamp / 1000;
  // 增加8个小时,北京时间比utc时间多八个时区
  timeStamp = timeStamp + 8 * 60 * 60;
  // 时间戳转为时间
  let normTime = new Date(parseInt(timeStamp) * 1000).toLocaleString().replace(/年|月/g, "-").replace(/日/g, " ");
  return normTime;
}

//  测试数据
let date = '2019-12-29T03:14:32.860Z'
//  let date = JSON.stringify(new Date())
console.log(utcToNorm(date));   // 2019-12-29 11:14:32

020.计算两个日期之间间隔几天

/**
 *  strDateStart 开始时间 (String)
 *  strDateEnd 结束时间 (String)
 */
intervalDate = (strDateStart,strDateEnd) => {
    let strSeparator = "-"; //日期分隔符
    let oDate1;
    let oDate2;
    let iDays;
    oDate1= strDateStart.split(strSeparator);
    oDate2= strDateEnd.split(strSeparator);
    let strDateS = new Date(oDate1[0], oDate1[1]-1, oDate1[2]);
    let strDateE = new Date(oDate2[0], oDate2[1]-1, oDate2[2]);
    iDays = parseInt(Math.abs(strDateS - strDateE ) / 1000 / 60 / 60 /24);//把相差的毫秒数转换为天数
    return iDays ;
}

//  测试数据
console.log(intervalDate('2020-1-3','2019-12-28'));   // 6
console.log(intervalDate('2020-01-03','2019-12-25'));   // 9

021.计算两个日期间隔几天(通过时间戳计算)

/**
 *  startTime 开始时间 (时间戳-毫秒)
 *  endTime 结束时间 (时间戳-毫秒)
 */

intervalTimeStamp = (startTime,endTime) => {
  let stime = new Date(startTime).getTime();
  let etime = new Date(endTime).getTime();
  let intervalTime = etime - stime; 
  let intervalDay=Math.floor(intervalTime/(24*3600*1000));
  let interval = intervalDay;
  return interval;
}

//  测试数据
console.log(intervalTimeStamp(1577808000000,1577980800000));  // 2

022.标准时间转时间戳

let date = new Date('2020-03-12 18:00:00');

// 有三种方式转化
let time1 = date.getTime();
let time2 = date.valueOf();
let time3 = Date.parse(date);

console.log(time1); //  1584007200000
console.log(time2); //  1584007200000
console.log(time3); //  1584007200000

023.获取某一天时间,或某一天前后的时间

/**
 * 获取某一天时间,或某一天前后的时间
 * @param {Number} AddDayCount 与某一天相比的相差的天数 必填 0 当天
 * @param {String} dateStr 某一天时间
 * @return {String} 返回一个格式为'yyyy-mm-dd'的字符串
 */
getDateStr = (AddDayCount, dateStr = new Date()) => {
    let date = new Date(dateStr)
    let addZero = value => { return value < 10 ? `0${value}` : value }
    date.setDate(date.getDate() + AddDayCount)
    let y = date.getFullYear()
    let m = date.getMonth() + 1
    let d = date.getDate()
    return `${y}-${addZero(m)}-${addZero(d)}`
}

console.log(getDateStr(-5))

024.获取某年某月有多少天

/**
 * 获取某年某月有多少天
 * @param {Number} year 某年
 * @param {Number} month 某月
 * @return {Number} 返回查询的当月的天数
 */
getDaysInOneMonth = (year, month) => {
    month = parseInt(month, 10)
    let d = new Date(year, month, 0)
    return d.getDate()
}

025.获取当前和N个月之前的时间

/**
 * n 表示n月之前
 */
getBeforeDate = n => {
    let cur = new Date()
    let y = cur.getFullYear()
    let m = cur.getMonth() + 1
    let d = cur.getDate()
    let Appendzero = v => v < 10 ? `0${v}` : v
    let now = `${Appendzero(y)}-${Appendzero(m)}-${Appendzero(d)}`
    if (m <= n) {
        m += 12 - n
        y--
    } else {
        m -= n
    }
    let before = `${Appendzero(y)}-${Appendzero(m)}-${Appendzero(d)}`
    return [before, now]
}