日期相关

格式化日期

/**
 * @param timestamp 时间戳
 * @param fmt
 * @returns {*}
 * 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
 * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
 * 例子:
 * (new Date()).Format(1540396800000,"yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
 * (new Date()).Format(1540396800000,"yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
 */
export function getFormatDate(timestamp, fmt) {
    if (!timestamp) return;

    let date = new Date(timestamp);

    let 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 (/(y+)/.test(fmt)) {
        fmt = fmt.replace(
            RegExp.$1,
            (date.getFullYear() + '').substr(4 - RegExp.$1.length)
        );
    }

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

    return fmt;
}

获取传入日期与当前时间的距离

/**
 * 获取传入的日期与当前时间的距离
 * @param timestamp 时间戳
 * @returns {*}
 * 1分钟内显示**秒;
 * 60分钟内显示**分钟;
 * 24小时内显示**小时;
 * 24小时(含)到 48小时(不含)内显示“1天前”;
 * 48小时(含)到 72小时(不含)内显示“2天前”;以此类推;
 * 30天(含)到 60天(不含)内显示“1个月前”;
 * 60天(含)到 90天(不含)内显示“2个月前”;以此类推;
 * 12个月(含)到24个月(不含)内显示“1年前”;
 * 24个月(含)到36个月(不含)内显示“2年前”;以此类推。
 */
export function getTimeAgo(timestamp) {
    let diff = new Date().getTime() - timestamp;
    let second = 1000;
    let minute = 1000 * 60; //把分,时,天,周,半个月,一个月用毫秒表示
    let hour = minute * 60;
    let day = hour * 24;
    let month = day * 30;
    let year = month * 12;
    // let week = day * 7;
    // let halfamonth = day * 15;

    let diffSection = [year, month, day, hour, minute, second];
    let diffSectionText = ['年前', '月前', '天前', '小时前', '分钟前', '秒前'];
    // 定义各个时间点,从大到小,超过时间点说明以那个时间点为准
    // 例如,超过 year ,则表示超过一年
    for (let i = 0; i < diffSection.length; i++) {
        if (diff > diffSection[i]) {
            let diffNum = diff / diffSection[i];
            return `${parseInt(diffNum)}${diffSectionText[i]}`;
        }
    }
    return '刚刚';
}

生成日期对象

export function parseDate(dateStr) {
    if (typeof dateStr === 'string') {
        return new Date(dateStr.replace(/-/g, '/'));
    }
    return new Date(dateStr);
}

日期加减,计算

/**
 * 日期加减
 * dateAdd(date,'d',5); //增加5天
 */
export function dateAdd(date, type, number) {
    var dtTmp = parseDate(date);
    switch (type) {
        case 'second':
        case 's':
            return new Date(Date.parse(dtTmp) + 1000 * number);
        case 'minute':
        case 'n':
            return new Date(Date.parse(dtTmp) + 60000 * number);
        case 'hour':
        case 'h':
            return new Date(Date.parse(dtTmp) + 3600000 * number);
        case 'day':
        case 'd':
            return new Date(Date.parse(dtTmp) + 86400000 * number);
        case 'week':
        case 'w':
            return new Date(Date.parse(dtTmp) + 86400000 * 7 * number);
        case 'month':
        case 'm':
            dtTmp.setMonth(dtTmp.getMonth() + number);
            return dtTmp;
        case 'year':
        case 'y':
            dtTmp.setFullYear(dtTmp.getFullYear() + number);
            return dtTmp;
    }
    return dtTmp;
}

获取当前时间

// 获取当前时间
export const now =
    Date.now ||
    function() {
        return new Date().getTime();
    };

格式化倒计时时间

/**
 * 格式化时间
 */
export function formatTime(time) {
    const seconds = Math.floor((time / 1000) % 60);
    const minutes = Math.floor((time / 1000 / 60) % 60);
    const hours = Math.floor((time / (1000 * 60 * 60)) % 24);
    const days = Math.floor(time / (1000 * 60 * 60 * 24));
    return { days, hours, minutes, seconds };
},

获取剩余时间

用于时间较长的倒计时,根据倒计时开始时的设备时间以及服务器时间差异,实时计算剩余时间

防止 app 切到后台时 js 不运行导致倒计时不准确

/**
 * 获取剩余时间 , 以下时间都是时间戳 13位的 ms
 * @param  {Number} endTime    截止时间
 * @param  {Number} deviceTime 设备时间
 * @param  {Number} serverTime 服务端时间
 * @return {Object}            剩余时间对象
 */
export function getRemainTime(endTime, deviceTime, serverTime) {
    const time = endTime - new Date().getTime() + (deviceTime - serverTime); // 一开始服务端的时间和客户端的时间差异
    return time;
},

上次更新: 10/16/2019, 9:39:25 AM