前言
日常开发中接口返回的日期数据可能是时间戳,这时候我们肯定不能直接把时间戳展示到页面上,需要将其转换成特定的字符串,比如: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或字符串,将该方法变得更加通用。