Unhandled Promise Rejection: RangeError: Invalid time value

Jia
Aug 14, 2022

2022.8.14

先講結論:

safari 的環境的new Date(),吃的參數字串比chrome嚴格

// chrome
new Date('2020-12-01 12:00:00')//pass
new Date('2020-12-12T12:00:00')//pass
//safari
new Date('2020-12-12 12:00:00')//error
new Date('2020-12-12T12:00:00')//pass

找尋程式裡new Date()部分,並檢查格式,修正格式,就能解決問題。

情境:

今天遇到客戶說,產品頁面打開一遍白,心理OS 怎麼可能?

看了客戶截圖,還真的是一遍白, ゚Д゚) ゚Д゚) ゚Д゚)

但有注意到一件事,客戶是用safari,就知道又是他在作怪

走了個ie,還有個safari==。

環境:vue3+pinia+typescritp

debugger:

開了safari 把開發者模式打開,只顯示了一行錯afari

他只噴了這行

Unhandled Promise Rejection: RangeError: Invalid time value

程式哪行錯,哪隻檔案錯 完全不知道 這樣怎麼找啊(/‵Д′)/(/‵Д′)/

問了google 大神,大概鎖定問題是出在safari new Date 部分,一看畫面白的一想到就是渲染問題,所以就解決方式就是從vue 程式進入點 main.ts 開始,一路到App.vue 到最後渲染的組件一層一層的設中斷點…

最後發現出在某個組件,其組件有一段

toDate 是一隻自己寫的function

export const toDate = (date: string) => format(new Date(date), 'yyyy-MM-dd')

大概是new Date 時出錯了,所以改造,拆分邏輯,並加入try catch,將空白替換成T

export const getNewDate = (date: string): Date => {
let _date = new Date()
try {
_date = new Date(date.replace(/ /g, 'T'))
} catch (error) {
console.warn('@@newDateTimeError:', date)
}
return _date
}
export const toDate = (date: string) => format(getNewDate(date), 'yyyy-MM-dd')

--

--

Jia

看一次不懂 就看兩次吧。每一天努力一點,不知不覺就會成為想像中的樣子的。 like60955@gmail.com