需求小能手——时间戳转换

201 阅读2分钟

前言

日常开发中接口返回的日期数据可能是时间戳,这时候我们肯定不能直接把时间戳展示到页面上,需要将其转换成特定的字符串,比如:2023-01-16 08:00:000,下面我们来看一个时间戳转换的函数。

实现

首先考虑一下入参跟出参,我们想要输入一个时间戳得到一个特定的字符串,所以入参是时间戳,出参是字符串,这个字符串是按照一定的格式,那么另一个入参就是想要转换的格式,格式或许会有点长,这里就把格式参数设定成可选参数并设定一个默认值,基于以上需求点,就能得到一下函数:

   function changeTimeStamp(time:number,format?:string):string {
   }

接下来就是转换,我这里就设定默认格式为 y-m-d h:i:s,要想获得此格式,就要用到日期相关方法去获取年月日、时分秒,需要注意一点getMonth获取的数据加1才是真正的月份。

  // 没传时采用默认值
  const realFormat = format || '{y}-{m}-{d} {h}:{i}:{s}'
  let date: Date
  // 校验类型与长度
   if (typeof time !== 'number' && time.toString().length !== 13) {
      window.alter('请输入时间戳')
      return
    }
    date = new Date(time)
  const formatObj: { [key: string]: number } = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }

得到了想要的数据,就到了最后一步替换。在默认格式中有y、m等字符,它们对应的值也都在formatObj对象,那么利用replace方法进行替换就能得到最终字符串。还有一点上述的值有可能是个位数,为了整齐美观点,选用padStart去填补:

   //将realFormat进行替换
   const timeStr = realFormat.replace(/{([ymdhisa])+}/g, (result, key) => {
    const value = formatObj[key]
    //星期判断 如果没有就不拼接
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value]
    }
    //如果不满两位就补0
    return value.toString().padStart(2, '0')
  })
  return timeStr

这样就实现了时间戳转换,传入一个时间戳,就能得到默认格式的字符串。

总结

上面我是根据时间戳为time,在函数里也是将时间戳先换成了date,所以时间入参类型可以再优化一下,变成日期Date或字符串,将该方法变得更加通用。