最近有个需求,把文章或者评论的发布时间转换成,刚刚,10分钟前....,这种表示方式,如下:
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;
}
}
这样,看起来就合理了很多。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。