封装的一些日期函数

109 阅读2分钟
/**
 * 时间格式方法
 *
 * @param {Date | Number} time  时间戳,秒级/毫秒级 或者日期型 Date
 * @param {String} format 格式化时间类型,默认  Y-M-D H:I:S
 * @returns {string} formatDate 格式化后的时间 例如: 2023-11-06 16:11:22
 */
function formatDate(time, format) {
    if (!time) {
        return "";
    }

    if (isNaN(parseInt(time)) && !(time instanceof Date)) {
        return time;
    }

    let date = new Date(time);
    let o = {
        "M+": date.getMonth() + 1, //月
        "d+": date.getDate(), //日
        "h+": date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, //时间
        "H+": date.getHours(), //24时间
        "m+": date.getMinutes(), //分
        "s+": date.getSeconds(), //秒
        "q+": Math.floor((date.getMonth() + 3) / 3), //季
        "S": date.getMilliseconds() //毫秒
    };
    let week = {
        "0": "日",
        "1": "一",
        "2": "二",
        "3": "三",
        "4": "四",
        "5": "五",
        "6": "六"
    };
    if (/(y+)/.test(format)) {
        format = format.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    }
    if (/(E+)/.test(format)) {
        format = format.replace(RegExp.$1, ((RegExp.$1.length > 1) ? "周" : "") + week[date.getDay() + ""]);
    }
    for (let k in o) {
        if (new RegExp("(" + k + ")").test(format)) {
            format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        }
    }

    return format;
}

/**
 * 计算距离当前时间
 *
 * @param {Date | Number} time  时间戳,秒级/毫秒级 或者日期型 Date
 * @returns 距离当前时间的显示值,如几分钟前、几天前
 */
function timeago(time) {
    //dateTimeStamp是一个时间毫秒,注意时间戳是秒的形式,在这个毫秒的基础上除以1000,就是十位数的时间戳。13位数的都是时间毫秒。
    var minute = 1000 * 60;      //把分,时,天,周,半个月,一个月用毫秒表示
    var hour = minute * 60;
    var day = hour * 24;
    var week = day * 7;
    var month = day * 30;
    var now = new Date().getTime();   //获取当前时间毫秒
    var dateTimeStamp = time instanceof Date ? time.getTime() : time;
    var diffValue = now - dateTimeStamp;//时间差

    if (diffValue < 0) {
        return '';
    }

    var minC = diffValue / minute;  //计算时间差的分,时,天,周,月
    var hourC = diffValue / hour;
    var dayC = diffValue / day;
    var weekC = diffValue / week;
    var monthC = diffValue / month;
    var result;

    if (monthC >= 1 && monthC <= 3) {
        result = " " + parseInt(monthC) + "月前"
    }
    else if (weekC >= 1 && weekC <= 3) {
        result = " " + parseInt(weekC) + "周前"
    }
    else if (dayC >= 1 && dayC <= 6) {
        result = " " + parseInt(dayC) + "天前"
    }
    else if (hourC >= 1 && hourC <= 23) {
        result = " " + parseInt(hourC) + "小时前"
    }
    else if (minC >= 1 && minC <= 59) {
        result = " " + parseInt(minC) + "分钟前"
    }
    else if (diffValue >= 0 && diffValue <= minute) {
        result = "刚刚"
    }
    else {
        var datetime = new Date();
        datetime.setTime(dateTimeStamp);
        var Nyear = datetime.getFullYear();
        var Nmonth = datetime.getMonth() + 1 < 10 ? "0" + (datetime.getMonth() + 1) : datetime.getMonth() + 1;
        var Ndate = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate();
        // var Nhour = datetime.getHours() < 10 ? "0" + datetime.getHours() : datetime.getHours();
        // var Nminute = datetime.getMinutes() < 10 ? "0" + datetime.getMinutes() : datetime.getMinutes();
        // var Nsecond = datetime.getSeconds() < 10 ? "0" + datetime.getSeconds() : datetime.getSeconds();
        result = Nyear + "-" + Nmonth + "-" + Ndate
    }

    return result;
}

/**
 * 将字符串转换为Date
 * 
 * @param {*} str 时间字符串,如"2021-05-20T06:12:31.168Z"
 * @returns 
 */
function parseDateISO(str) {
    //ISO format
    str = str.replace(/T/g, '-').replace(/:/g, '-').replace(/\./g, '-').replace(/ /g, '-');
    var array = str.split('-');
    str = array[0] + "/" + array[1] + "/" + array[2] + " " + array[3] + ":" + array[4] + ":" + array[5];
    return new Date(str);
}

/**
 * 将字符串转换为Date
 * 
 * @param {*} str 时间字符串,如"\/Date(1198908717056)\/"
 * @returns 
 */
function parseDateMicrosoft(str) {
    try {
        return new Date(parseInt(str.replace("/Date(", "").replace(")/", ""), 10));
    }
    catch (e) {
        return null;
    }
}

/**
 * 时间格式方法
 *
 * @param {String} format 格式化时间类型,默认  Y-M-D H:I:S
 * @returns {string} formatDate 格式化后的时间 例如: 2017-05-05 12:09:22
 */
Date.prototype.formatDate = function (format) {
    return formatDate(this, format);
};

/**
 * 计算距离当前时间
 *
 * @returns 距离当前时间的显示值,如几分钟前、几天前
 */
Date.prototype.timeago = function () {
    return timeago(this);
};

export {
    formatDate,
    timeago,
    parseDateISO,
    parseDateMicrosoft,
}