js new Date 建立時間默認是8點

 

原由

最近在寫一個頁面,須要用到時間控制。而後我經過new Date()傳入日期字符串建立了一個對象,並與當前時間作時間戳比較,結果12點剛過,就出問題了。舉個栗子spa

// 假設當前時間是2019年12月22日0點20分
new Date('2019-12-22').getTime() < new Date().getTime() // 上面的結果是什麼?正常來講應該是true吧,但很差意思啊,返回了false

 

百思不得其解,當時由於狀況緊急,查出了上面的建立時間返回的內容並非0點,而是8點code

因此就強行在時間字符串上拼接了時間:new Date('2019-12-22 00:00:00').getTime(), 強行解決了這個問題。對象

而後又碰到了在IOS上不識別中橫線分割的時間字符串問題,講中橫線轉成了反斜槓。blog

當時臨時解決問題後的字符串大概長這樣:字符串

new Date('2019/12/22 00:00:00').getTime() < new Date().getTime()

臨時解決問題。如今閒來無事,能夠看看這個問題到底是什麼鬼?get

嘗試

傳入不一樣的字符串格式,看看結果,我只嘗試了最常使用的兩種格式io

驚訝的發現,-分割的字符串,被默認解析到了8點,而/分割的字符串,默認解析到了0點。這麼說來,我以前有點屢次一舉了,直接講-替換成/就能夠了啊。function

探究

那麼爲何默認是8點呢?有沒有以爲8這個數字很值得關注,咱們所在的時區是東八區,若是以GMT標準0點來算的話,在那個時間點,這裏就是8點啊。class

那我就能夠這樣理解了,建立時間時,它默認時間確實是0點,可是是以GMT爲基準的,因此將其轉換成本地時間就是8點。而/分割的字符串在建立時,則是以本地時區爲基準。date

那麼爲何js會對不一樣分割的時間字符串進行不一樣處理呢?貌似是由於-分隔且具備前導0的日期字符串,會被解析成ISO格式的字符串,以GMT時區爲基準,不過我也沒看懂。

解決

最終,既然-分割的字符串會出問題,那我就講全部的-都換成/就行了,正好也能夠藉此解決IOS的兼容問題。

動手解決:

/** * 將時間字符串轉換成date對象 * @param dateStr * 時間字符串 */
function getDate(dateStr){ /* 若日期是使用-分割的,所有轉換成/ 由於只有日期時,js會將-分割的字符串基準時區設置爲GMT,與當前時區相差8小時 */ dateStr = dateStr.replace(/-/g, '/'); return new Date(dateStr); }
相關文章
相關標籤/搜索