js处理时间,刚刚,一分钟前,前几天

4,251 阅读3分钟

让你明明白白学知识,有代码,有讲解,抄的走,学的会!

我们在微信,QQ等社交软件,IM软件,可能会看到,xxx消息 刚刚发送,xxx消息多少分钟前发送

我们一般是拿到后天数据的时间 ,需要对时间做处理

分为以下几类,如果想分的更详细,可以继续判断

格式 描述
刚刚 消息在60秒以内的
XXX分钟前 消息在1个小时以内
10:23 消息是今天的,就只显示小时,分钟
2020-02-10 消息是昨天及以前,就显示具体年月日
/**
 * 时间转换
 * @params {String | Number} 时间字符串或者时间戳
 */
const formatTime = (time) => {
    // 拿到当前的时间戳(毫秒) -- 转换为秒
    let currentTime = new Date()
    let currentTimestamp = parseInt(currentTime.getTime() / 1000)
    
    // 传进来的时间戳(毫秒)
    let t = new Date(time)
    let oldTimestamp = parseInt(t.getTime() / 1000)
    
    // 年
    let oldY = t.getFullYear()
    // 月
    let oldM = t.getMonth() + 1
    // 日
    let oldD = t.getDate()
    // 时
    let oldH = t.getHours()
    // 分
    let oldi = t.getMinutes()
    // 秒
    let olds = t.getSeconds()
    
    // 相隔多少秒
    let timestampDiff = currentTimestamp - oldTimestamp
    console.log('===========================')
    console.log('间距--》', timestampDiff)
    if (timestampDiff < 60) { // 一分钟以内
    	return "刚刚"
    }
    
    if (timestampDiff < 60 * 60) { // 一小时以内
        return Math.floor(timestampDiff / 60) + '分钟前'
    }
    
    // 今天的时间
    if (oldY === currentTime.getFullYear() && oldM === (currentTime.getMonth() + 1) && oldD === currentTime.getDate()) {
    	// 10:22
        return `${zeroize(oldH)}:${zeroize(oldi)}`
    }
    
    // 剩下的,就是昨天及以前的数据
    return `${oldY}-${zeroize(oldM)}-${zeroize(oldD)}`
    
    // 补0
    function zeroize(num) {
        return num < 10 ? "0" + num : num
    }
}

export default {
    formatTime
}

测试


console.log('现在的时间,60秒以内',formatTime(new Date())) // 传递现在的时间

// 当天 往前推5个小时
let currentDay = (Date.now() / 1000) - 60*60*5
console.log('往前推5个小时--》',formatTime(new Date(currentDay * 1000)))

let timestamp = parseInt(Date.now() / 1000)

console.log("1分钟以前--》",formatTime(new Date(parseInt(timestamp - 60)*1000)))

console.log('一个小时以前',formatTime(new Date((timestamp - 60*60)*1000)))
console.log('2个小时以前',formatTime(new Date((timestamp - 60*60*2)*1000)))

// 测试凌晨的
// 现在时间是 14:53 往前推送14个小时, 53分钟
let before12 = (Date.now() / 1000) - 60*60*14-60*53
console.log('12小时以前--》', formatTime(new Date(before12 * 1000)))

// 测试昨天的
let before24 = (Date.now() / 1000) - 60*60*24
console.log('24小时以前--》', formatTime(new Date(before24 * 1000)))

效果

已经满足我们的需求了

上面的代码,直接拿过去就可以使用了, 删除注释即可

番外篇

快速获取 年月日

只要求年月日,就可以像下面这种方式,快速获取

new Date().toJSON().substring(0,10) // 返回 "2020-06-09"

new Date().toJSON().substring(0,10).replace(/-/g, "") // 返回 "20200609"

new Date(1008979200000).toJSON().substring(0,10) // "2001-12-22"

快速获取年与日,时分秒

如果对小时,分钟有需求的,可以像下面这样

// 第一个参数穿 zh 表示中国
let d1 = new Date().toLocaleString("zh", {
    year: "numeric",
    month: "2-digit", 
    day: "2-digit", 
    minute: "2-digit",
    hour:  "2-digit", 
    second: "2-digit",
    hour12: false
})

// "2020/06/09 15:22:38"

d1.replace(/\//g, "-")  // // "2020-06-09 15:22:38"

如此操作,是不是比你传统的方式,去获取年,获取月,获取日,还要处理月份+1,处理个位数补0操作,来的简单,便捷

快速获取某个日期的星期几

new Date().toLocaleString("zh", {
   weekday: "long"
}) // "星期三"

new Date().toLocaleString("zh", {
   weekday: "short"
}) // "周三"
    
new Date().toLocaleString("zh", {
   weekday: "narrow"
})  // "三"

// 传入一个合法的日期进去
new Date("2001-12-12").toLocaleString("zh", {
   weekday: "long"
}) // "星期三"

你看,你觉得你又行了, 这样是不是避免了一堆switch操作。

最下面的这个,只要你传入一个合法的日期字符串或者时间戳,那么这种取值方法都可以用,只要符合Date对象构造函数接收的入参要求即可