让你明明白白学知识,有代码,有讲解,抄的走,学的会!
我们在微信,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对象构造函数接收的入参要求即可