用dayjs解析时间戳,我被提了bug

用dayjs解析时间戳,我被提了bug引言前几天开发中突然接到测试提的一个 Bug 说我的时间组件显示异常 我很诧异 这里初始化数据是后端返回的 我什么也没改 这 bug 提给我干啥 我去问后端 这数据是不是有问题 后端答 没问题啊 我们一直都是这么返回的时间戳 其他人

大家好,欢迎来到IT知识分享网。

引言

前几天开发中突然接到测试提的一个 Bug,说我的时间组件显示异常。

我很诧异,这里初始化数据是后端返回的,我什么也没改,这 bug 提给我干啥。我去问后端:“这数据是不是有问题?”。后端答:“没问题啊,我们一直都是这么返回的时间戳,其他人用也没报错。”

于是,对比生产环境数据,我终于找到了问题根源:后端时间戳的类型,从 Number 静悄悄地变成了 String。

Bug原因

问题的原因,肯定就出现在时间数据解析上了,代 #技术分享码中,我统一用的 dayjs 做的时间解析。

如图,对时间戳的解析我都是这么写的

const time = dayjs(res.endTime).format('YYYY-MM-DD HH:mm:ss') 

于是,我分别试了两种数据类型的解析方式:

  • 字符型
dayjs('0').format('YYYY-MM-DD hh:mm:ss') 
  • 数值型
dayjs(Number('0')).format('YYYY-MM-DD HH:mm:ss') 

看来,问题原因显而易见了:

由于后端返回的是 字符串类型‘0’dayjs() 在处理字符串时,会尝试按“常见的日期字符串格式”进行解析(如 YYYY-MM-DDYYYYMMDD 等),并不会自动识别为时间戳 。所以它 不会把这个字符串当作毫秒时间戳来解析 ,而是直接失败(解析成无效日期),但 dayjs 会退化为 Unix epoch(1970 年)或给出错误结果,最终导致返回的是错误的时间。

如何避免此类问题

同 dayjs 一样,原生的 new Date() 在解析时间戳时也存在类似的问题,因此,不管是 Date 还是 dayjs ,一律对后端返回的时间戳 Number(input) 兜底处理,永远不要信任它传的是数字还是字符串:

const ts = Number(res.endTime); const date = new Date(ts); 

思考

其实出现这个问题,除了后端更改时间戳类型,也在于我没有充分理解“时间戳”的含义。我一直以为时间戳就是一段字符或一段数字,因此,从来没有想过做任何兜底处理。那么,什么是时间戳?

时间戳(Timestamp) 是一种用来表示时间的数字,通常表示从某个“起点时刻”到某个指定时间之间 所经过的时间长度 。这个“起点”大多数情况下是 1970 年 1 月 1 日 00:00:00 UTC(Unix 纪元)

常见时间戳类型:

| 类型 | 单位 | 示例值 | 说明 | | —

| Unix 时间戳(秒) | 秒 | | 常见于后端接口、数据库存储 | | 毫秒时间戳 | 毫秒 | 00 | JavaScript 常用,Date.now() |

时间戳的意义:

  • 它是一个 绝对时间的数字化表示 ,可以跨语言、跨平台统一理解;
  • 更容易做计算:两个时间戳相减就能得到毫秒差值(时间间隔);
  • 更紧凑:比如比字符串 “2025-07-17 06:59:59” 更短,处理性能更高。

在 JavaScript 中的使用:

console.log(Date.now()); console.log(new Date(00)); 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/187222.html

(0)
上一篇 2025-09-01 08:15
下一篇 2025-09-01 08:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信