1、前端开发涉及的各种时间处理

139 阅读2分钟

1、月日时分秒补0函数

function addZero(time) {
    let newTime = time > 9 ? time : '0' + time;
    return newTime;
}

2、将毫秒时间转换为本地时间字符串,支持格式毫秒

/**
 * @description 返回格式:yyyy-mm-dd hh:mm:ss
 * @param {string} timeStr 源时间,毫秒格式
 */
function toLocaleStringByMs(timeStr) {
    const time = {};
    if (!timeStr) {
        return '';
    }
    let date = new Date(timeStr);

    time.y = date.getFullYear();
    time.m = addZero(date.getMonth() + 1);
    time.d = addZero(date.getDate());
    time.h = addZero(date.getHours());
    time.min = addZero(date.getMinutes());
    time.s = addZero(date.getSeconds());
    return `${time.y}-${time.m}-${time.d} ${time.h}:${time.min}:${time.s}`;
}
//调用方法
var t = +new Date()//1683856659702
toLocaleStringByMs(t)//"2023-05-12 09:57:39"

3、校验时间格式

/**
 * 校验时间格式
 * @param {string} time 时间格式,如 10:00:00
 */
 function valifyTime(time) {
    const reg = /^\d{2}:\d{2}:\d{2}$/;
    return reg.test(time);
}

4、判定两组时间序列是否存在重复

/**
 * 判定两组时间序列是否存在重复(交叉或包含)
 * @param {array} time1Arr 时间范围,如 [10:00:00, 12:00:00]
 * @param {array} time2Arr 时间范围,如 [09:00:00, 23:00:00]
 */
function isTimeContainTime(time1Arr, time2Arr) {
    let timeArr;
    let validate = true;
    // 确保两组时间范围格式正确
    if (!Array.isArray(time1Arr) || !Array.isArray(time2Arr)) {
        throw new Error('Please enter two array.');
    }
    if (time1Arr.length !== 2 || time2Arr.length !== 2) {
        throw new Error('Please enter currect time.');
    }
    timeArr = [...time1Arr, ...time2Arr];
    for (let time of timeArr) {
        if (!valifyTime(time)) {
            throw new Error('Please enter currect time.');
        }
    }

    // 检验时间是否存在重复
    if (
        (time2Arr[0] > time1Arr[0] && time2Arr[0] < time1Arr[1]) ||
        (time2Arr[1] > time1Arr[0] && time2Arr[1] < time1Arr[1])
    ) {
        validate = false;
    }
    if (
        (time1Arr[0] > time2Arr[0] && time1Arr[0] < time2Arr[1]) ||
        (time1Arr[1] > time2Arr[0] && time1Arr[1] < time2Arr[1])
    ) {
        validate = false;
    }

    return validate;
}

5、将时间转换为UTC时间字符串,支持格式 hh:mm:ss

/**
 * 将时间转换为UTC时间字符串,支持格式 hh:mm:ss
 * @description 按源格式返回
 * @param {string} timeStr 源时间
 * @returns {object} 包含time和日期偏差
 */
 function toISOStringByTime(timeStr) {
    const time = {};
    let date = new Date(`2000/10/24 ${timeStr}`);
    time.d = date.getUTCDate();
    time.h = addZero(date.getUTCHours());
    time.min = addZero(date.getUTCMinutes());
    time.s = addZero(date.getUTCSeconds());

    return {
        offset: time.d - 24,
        time: `${time.h}:${time.min}:${time.s}`
    };
}

6、将时间转换为UTC时间字符串,支持格式 yyyy-mm-dd hh:mm:ss

/**
 * 将时间转换为UTC时间字符串,支持格式 yyyy-mm-dd hh:mm:ss
 * @description 按源格式返回
 * @param {string} timeStr 源时间
 * @param {string} type str 普通时间格式, utcStr yyyymmddThhmmssZ格式
 */
function toISOStringByDate(timeStr, type = 'str') {
    const time = {};
    let newTime;
    let date = new Date(timeStr.replace(/-/g, '/'));
    time.y = date.getUTCFullYear();
    time.m = addZero(date.getUTCMonth() + 1);
    time.d = addZero(date.getUTCDate());
    time.h = addZero(date.getUTCHours());
    time.min = addZero(date.getUTCMinutes());
    time.s = addZero(date.getUTCSeconds());

    if (type === 'utcStr') {
        newTime = `${time.y}${time.m}${time.d}T${time.h}${time.min}${time.s}Z`;
    } else {
        newTime = `${time.y}-${time.m}-${time.d} ${time.h}:${time.min}:${time.s}`;
    }

    return newTime;
}

7、将时间转换为UTC时间字符串

 /**
 * 将时间转换为UTC时间字符串
 * @description 按源格式返回,目前支持格式1970-01-01 00:00:00
 * @param {string} timeStr 源时间
 * @param {string} type str 普通时间格式, utcStr yyyymmddThhmmssZ格式
 */
function toISOString(timeStr, type) {
    try {
        if (REG.DATE.test(timeStr)) {
            // 格式 yyyy-mm-dd hh:mm:ss
            return toISOStringByDate(timeStr, type);
        } else if (REG.TIME.test(timeStr)) {
            // 格式 hh:mm:ss
            return toISOStringByTime(timeStr);
        }
    } catch (e) {
        return '';
    }

    //throw new Error('Please enter date as yyyy-mm-dd hh:mm:ss');
}

8、格式化时间

/**
 * 格式化时间
 *
 * @param {any} date
 * @param {any} format
 * @returns
 */
function dateFormat(date, format) {
    let format1 = format;
    var o = {
        'M+': date.getMonth() + 1,
        'd+': date.getDate(),
        'H+': date.getHours(),
        'm+': date.getMinutes(),
        's+': date.getSeconds(),
        'q+': Math.floor((date.getMonth() + 3) / 3),
        'S+': date.getMilliseconds()
    };

    if (!format1) {
        format1 = 'yyyy-MM-dd';
    }

    if (/(y+)/.test(format1)) {
        format1 = format1.replace(
            RegExp.$1,
            (date.getFullYear() + '').substr(4 - RegExp.$1.length)
        );
    }

    if (/(S+)/.test(format1)) {
        format1 = format1.replace(
            RegExp.$1,
            (date.getMilliseconds() + '').substr(3 - RegExp.$1.length)
        );
    }

    for (var k in o) {
        if (new RegExp('(' + k + ')').test(format1)) {
            format1 = format1.replace(
                RegExp.$1,
                RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
            );
        }
    }
    return format1;
}

9、将UTC时间转换为本地时间字符串,支持格式 hh:mm:ss

/**
 * 将UTC时间转换为本地时间字符串,支持格式 hh:mm:ss
 * @description 默认传入的为UTC时间,此处由于各版本浏览器支持性不一,故使用Date.UTC()
 * @param {string} timeStr 源时间
 * @returns {object} 包含time和日期偏差
 */
function toLocaleStringByTime(timeStr) {
    const time = {};

    let timeList = timeStr.split(':');

    let utcDate = Date.UTC(2000, 10, 24, timeList[0], timeList[1], timeList[2]);
    let date = new Date(utcDate);

    time.d = date.getDate();
    time.h = addZero(date.getHours());
    time.min = addZero(date.getMinutes());
    time.s = addZero(date.getSeconds());

    return {
        offset: time.d - 24,
        time: `${time.h}:${time.min}:${time.s}`
    };
}

10、将UTC时间转换为本地时间字符串

/**
 * 将UTC时间转换为本地时间字符串
 * @description 默认传入的为UTC时间,目前支持格式1970-01-01 00:00:00
 * @param {string} timeStr 源时间
 */
function toLocaleStringEx(timeStr) {
    try {
        if (REG.DATE.test(timeStr)) {
            // 格式 yyyy-mm-dd hh:mm:ss
            return toLocaleStringByDate(timeStr);
        } else if (REG.TIME.test(timeStr)) {
            // 格式 hh:mm:ss
            return toLocaleStringByTime(timeStr);
        } else if (REG.DATE_Z.test(timeStr)) {
            // 格式 yyyymmddThhmmssZ
            let newTime = timeStr.replace(/[^0-9]/g, '');
            let date = `${newTime.slice(0, 4)}-${newTime.slice(4, 6)}-${newTime.slice(6, 8)}`;
            let time = `${newTime.slice(8, 10)}:${newTime.slice(10, 12)}:${newTime.slice(12, 14)}`;
            return toLocaleStringByDate(`${date} ${time}`);
        } else if (REG.DATE_M_D_Y.test(timeStr)) {
            let newTime = timeStr.split(' ');
            let dateList = newTime[0].split('-');
            let time = newTime[1];

            return toLocaleStringByDate(
                `${dateList[2]}-${dateList[0]}-${dateList[1]} ${time}`,
                'mmDDyy'
            );
        }
    } catch (e) {
        console.log('Please enter date as yyyy-mm-dd hh:mm:ss');
        return '';
    }
}

11、# 全局时间过滤器

获取日期对象,使用以下获取年月日时分秒的方法
使用padStart()方法用于时间补0,即不足2位用0补充
将时间进行格式拼接返回出来
Vue.filter('dateFormat', function (originVal) {
  const dt = new Date(originVal)

  const y = dt.getFullYear()
  const m = (dt.getMonth() + 1 + '').padStart(2, '0')
  const d = (dt.getDate() + '').padStart(2, '0')

  const hh = (dt.getHours() + '').padStart(2, '0')
  const mm = (dt.getMinutes() + '').padStart(2, '0')
  const ss = (dt.getSeconds() + '').padStart(2, '0')

  return `${y}-${m}-${d} ${hh}:${mm}:${ss}`
})
调用:

获取完时间数据后,调用dataFormat时间过滤器即可
{{scope.row.add_time | dateFormat}}