头图
最近有个需求,把文章或者评论的发布时间转换成,刚刚,10分钟前....,这种表示方式,如下:

IICOOM格式化过去时间

JavaScript格式化时间

/**
 * 格式化 已经过去的时间
 * @param {*} value 时间戳(ms) 或时间对象
 * @returns 
 */
function elapsed(value) {

    const time = Date.now() - new Date(value)

    const times = [31536000000, 2592000000, 86400000, 3600000, 60000, 1000] 
    const units = ['年前', '月前', '天前', '小时前', '分钟前', '秒前']

    let index = times.findIndex(t => t < time)

    return Math.round(time/times[index]) + units[index]
}

console.log(elapsed(1649743490030))
// 14秒前

通过上面的方法,初步实现了。但是感觉还是units处理过于死板,后续需要参考其他网站做下优化。

改进

上边的units我们其实可以把'秒前'改为'刚刚',即小于1分钟的表示为刚刚,而大于一天的直接展示日期:

/**
 * 格式化 已经过去的时间
 * @param {*} value 时间戳(ms) 或时间对象
 * @returns 
 */
function elapsed(value) {
    const time = Date.now() - new Date(value)
    const times = [3600000, 60000, 1000]
    const units = [' 小时前', ' 分钟前', ' 刚刚']
    if (time > 86400000) {
      return globalFunction.format(value, 'YYYY-MM-DD HH:mm')
    } else {
      let index = times.findIndex(t => t < time)
      return [-1,2].includes(index)?units[2]:Math.round(time/times[index]) + units[index]
    }
}

/**
 * 13位时间戳
 * @param {*} value 
 * @returns 
 */
function format(value, format) {
    let date = new Date(value);
    let year = date.getFullYear();
    let month = ("0" + (date.getMonth() + 1)).slice(-2);
    let day = ("0" + date.getDate()).slice(-2);
    let hour = ("0" + date.getHours()).slice(-2);
    let minute = ("0" + date.getMinutes()).slice(-2);
    let second = ("0" + date.getSeconds()).slice(-2);
    // 拼接
    if (!format) {
      return year + "-"+ month +"-"+ day +" "+ hour +":"+ minute+":"+second;
    }
    if (format === 'YYYY-MM-DD HH:mm') {
      return year + "-"+ month +"-"+ day +" "+ hour +":"+ minute;
    }
}

这样,看起来就合理了很多。


来了老弟
508 声望31 粉丝

纸上得来终觉浅,绝知此事要躬行