LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

用dayjs解析時(shí)間戳,我被提了bug

admin
2025年6月8日 22:24 本文熱度 853

引言

前幾天開(kāi)發(fā)中突然接到測(cè)試提的一個(gè) Bug,說(shuō)我的時(shí)間組件顯示異常。

我很詫異,這里初始化數(shù)據(jù)是后端返回的,我什么也沒(méi)改,這 bug 提給我干啥。我去問(wèn)后端:“這數(shù)據(jù)是不是有問(wèn)題?”。后端答:“沒(méi)問(wèn)題啊,我們一直都是這么返回的時(shí)間戳,其他人用也沒(méi)報(bào)錯(cuò)。”

于是,對(duì)比生產(chǎn)環(huán)境數(shù)據(jù),我終于找到了問(wèn)題根源:「后端時(shí)間戳的類(lèi)型,從 Number 靜悄悄地變成了 String。」

Bug 原因

問(wèn)題的原因,肯定就出現(xiàn)在時(shí)間數(shù)據(jù)解析上了,代碼中,我統(tǒng)一用的 dayjs 做的時(shí)間解析。

如圖,對(duì)時(shí)間戳的解析我都是這么寫(xiě)的

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

于是,我分別試了兩種數(shù)據(jù)類(lèi)型的解析方式:

  • 字符型
dayjs('175008959900').format('YYYY-MM-DD hh:mm:ss') // 1975-07-19 01:35:59
  • 數(shù)值型
dayjs(Number('175008959900')).format('YYYY-MM-DD HH:mm:ss') // 2025-07-17 06:59:59

看來(lái),問(wèn)題原因顯而易見(jiàn)了:

由于后端返回的是「字符串類(lèi)型」?的?'175008959900'dayjs()?在處理字符串時(shí),會(huì)嘗試按 “常見(jiàn)的日期字符串格式” 進(jìn)行解析(如?YYYY-MM-DDYYYYMMDD?等),「并不會(huì)自動(dòng)識(shí)別為時(shí)間戳」。所以它「不會(huì)把這個(gè)字符串當(dāng)作毫秒時(shí)間戳來(lái)解析」,而是直接失敗(解析成無(wú)效日期),但 dayjs 會(huì)退化為 Unix epoch(1970 年)或給出錯(cuò)誤結(jié)果,最終導(dǎo)致返回的是錯(cuò)誤的時(shí)間。

如何避免此類(lèi)問(wèn)題

同 dayjs 一樣,原生的?new Date()?在解析時(shí)間戳?xí)r也存在類(lèi)似的問(wèn)題,因此,不管是?Date?還是?dayjs,一律對(duì)后端返回的時(shí)間戳?Number(input)?兜底處理,永遠(yuǎn)不要信任它傳的是數(shù)字還是字符串:

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

思考

其實(shí)出現(xiàn)這個(gè)問(wèn)題,除了后端更改時(shí)間戳類(lèi)型,也在于我沒(méi)有充分理解 “時(shí)間戳” 的含義。我一直以為時(shí)間戳就是一段字符或一段數(shù)字,因此,從來(lái)沒(méi)有想過(guò)做任何兜底處理。那么,什么是時(shí)間戳?

「時(shí)間戳(Timestamp)」?是一種用來(lái)表示時(shí)間的數(shù)字,通常表示從某個(gè) “起點(diǎn)時(shí)刻” 到某個(gè)指定時(shí)間之間「所經(jīng)過(guò)的時(shí)間長(zhǎng)度」。這個(gè) “起點(diǎn)” 大多數(shù)情況下是?「1970 年 1 月 1 日 00:00:00 UTC(Unix 紀(jì)元)」?。

「常見(jiàn)時(shí)間戳類(lèi)型:」

類(lèi)型
單位
示例值
說(shuō)明
Unix 時(shí)間戳(秒)
1750089599
常見(jiàn)于后端接口、數(shù)據(jù)庫(kù)存儲(chǔ)
毫秒時(shí)間戳
毫秒
1750089599000
JavaScript 常用,Date.now()

「時(shí)間戳的意義:」

  • 它是一個(gè)?「絕對(duì)時(shí)間的數(shù)字化表示」,可以跨語(yǔ)言、跨平臺(tái)統(tǒng)一理解;
  • 更容易做計(jì)算:兩個(gè)時(shí)間戳相減就能得到毫秒差值(時(shí)間間隔);
  • 更緊湊:比如比字符串?"2025-07-17 06:59:59"?更短,處理性能更高。

「在 JavaScript 中的使用:」

console.log(Date.now()); // 比如:1714729530000

// 將時(shí)間戳轉(zhuǎn)為日期
console.log(new Date(1750089599000)); // Thu Jul 17 2025 06:59:59 GMT+0800


關(guān)注更多AI編程資訊請(qǐng)去AI Coding專(zhuān)區(qū):https://juejin.cn/aicoding

閱讀原文:原文鏈接


該文章在 2025/6/9 9:58:32 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
精品国产一区二区三区久久 | 中文字幕不卡高清免费v | 日本免费无遮挡一区二区三区精品视频 | 亚洲欧美日韩午夜福利 | 亚洲国产日韩欧美在线看片 | 亚洲精品自产拍在线 |