(JS格式化时间)下午、上午、凌晨、昨天上午、昨天下午、昨天凌晨、星期几... 仿微信消息时间

得到仿微信消息时间描述(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'))
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值