评论

简单的时间格式化

处理时间格式化显示的问题,以及时间的加减操作

时间格式化是很常见的需求,即便是微信开发者工具初始化的极简项目里,util.js 也写了一个公用方法 formatTime(),其格式是固定的。

如果需要灵活的格式化,moment 是不错的选择,但小程序单包(主包/分包)大小不能超过 2M,这限制了我们不能导入太多功能库。当然,另一方面也提醒我们精简代码。

如果只是为了显示,不操作日期,以下方法可满足一般的需求,直接上代码

/**
 * @param {String} fmt eg: yyyy-MM-dd hh:mm
 * @author meizz
 * https://blog.csdn.net/meizz/article/details/405708
 */
Date.prototype.Format = function (fmt) {
  const o = {
    'M+': this.getMonth() + 1,
    'd+': this.getDate(),
    'h+': this.getHours(),
    'm+': this.getMinutes(),
    's+': this.getSeconds(),
    'q+': Math.floor((this.getMonth() + 3) / 3),
    S: this.getMilliseconds()
  }
  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length))
  for (let k in o) if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr((o[k] + '').length))
  return fmt
}

这个方法来自 meizz,以下是简单的几个栗子

// 最常用的格式
new Date().Format('yyyy-MM-dd hh:mm') // 2020-05-20 13:14

const log = console.log
const date = new Date('2020-05-20 13:14:20:233')

log(date.Format('yyyy-MM-dd')) // 日期:2020-05-20
log(date.Format('yy-MM-dd')) // 年份显示后两位:20-05-20
log(date.Format('yy-M-d')) // 个位数时不补0:20-5-20
log(date.Format('yyyy年M月d日')) // 自定义分隔符:2020年5月20日
log(date.Format('M/d/yyyy')) // 自定义顺序:5/20/2020

log(date.Format('h:m:s')) // 时间:13:14:20
log(date.Format('hh:mm:ss S')) // 毫秒:13:14:20 233

// 随便你写,有出现 y M d h m s q S 字符的都可以
log(date.Format('现在是yyyy年M月份,第q季度')) // 现在是2020年5月份,第2季度

Format() 方法是为了处理格式化显示,如果需要对时间进行一丢丢加减操作呢(如使用 localStorage 缓存数据常需要设置过期时间),于是我写了个方法

/**
 * @param {Number} num
 * @param {String} unit enum: y,M,d,h,m,s
 */
Date.prototype.Add = function (num, unit) {
  const s = 1000, m = s * 60, h = m * 60, d = h * 24, M = d * 30, y = M * 12
  const obj = { s, m, h, d, M, y }
  if (!Object.keys(obj).includes(unit)) throw new Error(`Invalid param unit`)
  return new Date(this.getTime() + num * obj[unit])
}

简单使用的栗子🌰

const log = console.log
const date = new Date('2020-05-20 13:14:20:233')

// 加两小时
log(date.Add(2, 'h')) // 2020-05-20T07:14:20.233Z

// 减 10 分钟
log(date.Add(-10, 'm')) // 2020-05-20T05:04:20.233Z

// 返回为 Date 对象,可配合 Format() 链式调用
log(date.Add(1, 'd').Format('明天是M月d日')) // 明天是5月21日
最后一次编辑于  2020-05-22  
点赞 1
收藏
评论

1 个评论

  • 彭世瑜
    彭世瑜
    2021-10-18

    优秀啊,已放入收藏夹

    2021-10-18
    赞同
    回复
登录 后发表内容