Moment的feature導(dǎo)致線(xiàn)上bug解決分析
bug的出現(xiàn)
這一天,本來(lái)是平平淡淡的一天,我正準(zhǔn)備一如既往的到點(diǎn)下班,結(jié)果qa說(shuō)線(xiàn)上出了個(gè)匪夷所思的bug。
表象為:用戶(hù)在日期選擇器選擇了1964-01-01之后,自動(dòng)變成了1963-12-31
我心里想:這是什么神奇bug,于是我又嘗試了一下選擇1964-01-02、1963-12-31、1965-01-01、1963-01-01,結(jié)果都正常,那么到底是為什么會(huì)引發(fā)這個(gè)bug呢?
bug排查
由于后端把時(shí)間、日期類(lèi)的字段都定義為了時(shí)間戳,因此前端是有進(jìn)行一些處理的,可以看下面這個(gè)圖

從接口中拿到時(shí)間戳后,會(huì)先存到內(nèi)存中,格式化后傳入antd日期選擇器中。每當(dāng)用戶(hù)選擇日期之后,我會(huì)截取日期中的年月日,然后使用moment-timezone去獲取到雅加達(dá)(印尼首都)當(dāng)天零點(diǎn)的時(shí)間戳,存儲(chǔ)到內(nèi)存中,當(dāng)用戶(hù)點(diǎn)擊提交的時(shí)候,這個(gè)時(shí)間戳就會(huì)被提交到后端去
再來(lái)看一下用戶(hù)選擇日期后進(jìn)行處理的代碼
import momentTimeZone from 'moment-timezone';
import moment from 'moment';
import type { Moment } from 'moment';
convert = (value?: Moment | null) => {
if (value) {
const valueString = momentTimezone.tz(value.format('YYYY-MM-DD'), 'Asia/Jakarta').format();
return (moment(valueString).valueOf() / 1000).toFixed();
}
return value;
}bug的根因
乍一看,沒(méi)什么問(wèn)題呀,于是我開(kāi)始斷點(diǎn),腦溢血的一幕出現(xiàn)了,大家可以去momentjs.com/timezone/do… 這個(gè)頁(yè)面上試一試,百分百?gòu)?fù)現(xiàn)

// 讓人大吃一驚的等式
moment.tz('1961-01-01', 'Asia/Jakarta').format() === '1963-12-31T23:30:00+07:00';這怎么轉(zhuǎn)換之后,日期還給我整錯(cuò)了呢?我的第一反應(yīng)就是給moment-timezone提issue,結(jié)果沒(méi)想到有人趕在了我的前面 github.com/moment/mome…
官方也解釋的很清楚了:由于當(dāng)?shù)貧v史原因,雅加達(dá)在1964年之前都是按東七半?yún)^(qū)來(lái)計(jì)算時(shí)區(qū)的,1964年開(kāi)始才按照東七區(qū)來(lái)計(jì)算,總的來(lái)說(shuō),這個(gè)匪夷所思的等式居然是個(gè)feature,只是我使用之前沒(méi)有了解清楚,所以出了bug,這鍋是甩不掉了
解決方案
經(jīng)過(guò)一系列的討論,我們認(rèn)為其實(shí)日期類(lèi)型的字段用時(shí)間戳表達(dá)是不準(zhǔn)確的,比如元旦這個(gè)節(jié)日,在全世界任何一個(gè)地區(qū)都應(yīng)該是1月1日,可是如果用時(shí)間戳表達(dá)的話(huà),可能在某些地區(qū)的確是1月1日,但是在其他地區(qū)卻可能是1月2日了,因此正確的設(shè)計(jì)應(yīng)該是用日期字符串來(lái)進(jìn)行存儲(chǔ)和傳輸,比如"2022-01-01",這樣才能避免類(lèi)似的bug,于是前端、app和be都進(jìn)行了對(duì)應(yīng)的修改,并且發(fā)布了hotfix
雖然影響范圍比較小,但是眾所周知蝦皮對(duì)于質(zhì)量是看的很重的,特別是線(xiàn)上的質(zhì)量。。。只是可惜了我的績(jī)效。。
好了以上就是Moment的feature導(dǎo)致線(xiàn)上bug解決分析的詳細(xì)內(nèi)容,更多關(guān)于Moment feature線(xiàn)上bug的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
微信小程序 本地?cái)?shù)據(jù)讀取實(shí)例
這篇文章主要介紹了微信小程序 本地?cái)?shù)據(jù)讀取實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04
JavaScript節(jié)點(diǎn)的增刪改查深入學(xué)習(xí)
這篇文章主要為大家介紹了JavaScript節(jié)點(diǎn)的增刪改查深入學(xué)習(xí)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
JS前端設(shè)計(jì)模式之發(fā)布訂閱模式詳解
這篇文章主要為大家介紹了JS前端設(shè)計(jì)模式之發(fā)布訂閱模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
requestAnimationFrame定時(shí)動(dòng)畫(huà)屏幕刷新率節(jié)流示例淺析
這篇文章主要為大家介紹了requestAnimationFrame定時(shí)動(dòng)畫(huà)屏幕刷新率節(jié)流示例淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

