得到仿微信消息时间描述(getWxTimeMemo), 传入 Date 对象 和 锚点, 锚点一般为当前时间 (可定制, 调整condition配置即可自由调整时间描述)
// 调用示例及返回结果说明
// 设置一个锚点,此处指定时间是为了演示效果, 一般直接new Date() 即可, getAnchorParams 会得到传入时间当天0点
// var anchorParams = getAnchorParams(new Date())
var anchorParams = getAnchorParams(strToDate('2022-09-08 08:55:55'))
// 需计算的时间
var currentTime = strToDate('2022-09-08 23:09:15')
console.log(getWxTimeMemo(currentTime , anchorParams))
// 下午23:09
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 12), anchorParams))
// 上午11:09
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 23), anchorParams))
// 凌晨00:09
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 24), anchorParams))
// 昨天 下午23:09
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 36), anchorParams))
// 昨天 上午11:09
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 46.5), anchorParams))
// 昨天 凌晨00:39
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 50), anchorParams))
// 星期二
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 24 * 3), anchorParams))
// 星期一
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 24 * 6), anchorParams))
// 星期五
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 24 * 7), anchorParams))
// 09月01日
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 24 * 20), anchorParams))
// 08月19日
console.log(getWxTimeMemo(new Date(currentTime.getTime() - 3600 * 1000 * 24 * 365), anchorParams))
// 2021年09月08日
// 包含一个主方法和3个附属方法
// 得到微信时间描述
function getWxTimeMemo(date, anchorParams) {
var pointParams = parseTimeAllParams(date)
var anchorTimestamp = anchorParams.timestamp
var pointTimestamp = pointParams.timestamp
var anchorYear = anchorParams.y
var pointYear = pointParams.y
// 仿微信消息时间描述 按条件顺序进行判定,满足条件即返回
// 今天 / 昨天 [凌晨(0-5)/ 上午 (6-11) / 下午 (12 - 23)] 6:00
// 7天内 星期几 星期一
// 今年 x月xx号
// 更早 xxxx年 x月xx日
var condition = [
{ timestamp: anchorTimestamp + 3600 * 1000 * 12, format: '下午{h}:{i}' }, // 今天下午
{ timestamp: anchorTimestamp + 3600 * 1000 * 6, format: '上午{h}:{i}' }, // 今天上午
{ timestamp: anchorTimestamp, format: '凌晨{h}:{i}' }, // 今天凌晨
{ timestamp: anchorTimestamp - 3600 * 1000 * 12, format: '昨天 下午{h}:{i}' }, // 昨天下午
{ timestamp: anchorTimestamp - 3600 * 1000 * 18, format: '昨天 上午{h}:{i}' }, // 昨天上午
{ timestamp: anchorTimestamp - 3600 * 1000 * 24, format: '昨天 凌晨{h}:{i}' }, // 昨天凌晨
{ timestamp: anchorTimestamp - 3600 * 1000 * 24 * 6, format: '星期{a}' }, // 7天内
{ timestamp: pointYear - anchorYear === 0, format: '{m}月{d}日' }, // 今年(为0时表示今年)
{ timestamp: pointYear - anchorYear < 0, format: '{y}年{m}月{d}日' } // 更早
]
for (var i = 0; i < condition.length; i++) {
if (typeof condition[i].timestamp === 'number') {
if (pointTimestamp >= condition[i].timestamp) {
return parseTimeAllParams(pointParams.time, condition[i].format).strTime
}
} else {
if (condition[i].timestamp) {
return parseTimeAllParams(pointParams.time, condition[i].format).strTime
}
}
}
return parseTimeAllParams(pointParams.time, '{y}年{m}月{d}日').strTime
}
function parseTimeAllParams(time, cFormat) {
if (arguments.length === 0 || !time) {
return null
}
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if ((typeof time === 'string')) {
if ((/^[0-9]+$/.test(time))) {
// support "1548221490638"
time = parseInt(time)
} else {
// support safari
time = time.replace(new RegExp(/-/gm), '/')
}
}
if ((typeof time === 'number') && (time.toString().length === 10)) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
const value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
return value.toString().padStart(2, '0')
})
return {
strTime: time_str, ...formatObj, a: ['日', '一', '二', '三', '四', '五', '六'][date.getDay()], timestamp: time.getTime(), time: date
}
}
// 调用示例 console.log(strToDate('2021-11-04 12:05:05'))
// 调用示例 console.log(strToDate('2021-11-04 12:05:05', 'yyyy-MM-dd hh:mm:ss'))
// 调用示例 console.log(strToDate('20211104', 'yyyyMMdd'))
// 调用示例 console.log(strToDate('20211104120505', 'yyyyMMddhhmmss'))
function strToDate(str, pattern = 'yyyy-MM-dd hh:mm:ss') {
if (str && typeof str === 'string') {
var formatIndex = [
/[y]+/.exec(pattern),
/[M]+/.exec(pattern),
/[d]+/.exec(pattern),
/[h]+/.exec(pattern),
/[m]+/.exec(pattern),
/[s]+/.exec(pattern)
]
var datePart = [0, 1, 1, 0, 0, 0]
var isRun = true
formatIndex.forEach((conf, index) =>{
var s = conf ? str.substr(conf.index, conf[0].length) : ''
if (s && isRun) {
datePart[index] = parseInt(s)
} else {
isRun = false
}
});
datePart[1] -= 1
return new Date(...datePart)
} else {
return ''
}
}
function getAnchorParams (date) {
return parseTimeAllParams(strToDate(parseTimeAllParams(date).strTime, 'yyyy-MM-dd'))
}