做爲90後的我一直覺得中國是沒有夏令時的概念的,直到上次項目中碰到一個問題。javascript
問題是這樣的,客戶在管理後臺錄入一我的員的生日是1989-05-23
但是到ios
上發現日期是1989-05-22
。由於先後端使用的時間戳來傳遞時間的,在ios上格式化爲YYYY-MM-DD HH:mm:ss
以後打印發現是1989-05-22 23:00:00
。而在android
和chrome
上打印的都是1989-05-23 00:00:00
。足足少了一個小時。java
在中國的話通常時間上少8小時,那麼多是國際標準時間和北京時間的時差致使的,一個小時卻是不多見。不過以前作過一個國際的項目,針對歐美那邊的用戶有個叫夏令時冬令時的差異,這個剛好是有一小時的先後調整。會不會是夏令時致使的呢?android
因而在chrome
和safari
上試了一下:ios
// chrome
new Date(1989, 4, 23) // Tue May 23 1989 00:00:00 GMT+0900 (中國夏令時間)
// safari
new Date(1989, 4, 23) // Tue May 23 1989 00:00:00 GMT+0800 (CST) = $6
複製代碼
咱們能夠看到chrome
自動針對當地時區作了夏令時轉換,後面的時區是GMT+0900
,而safari
是GMT+0800
。chrome
查了一下,原來中國在86年-92年
實行了一段時間的夏令時:後端
1986年4月,中國中央有關部門發出「在全國範圍內實行夏時制的通知」,具體做法是:每一年從四月中旬第一個星期日的凌晨2時整(北京時間),將時鐘撥快一小時,即將錶針由2時撥至3時,夏令時開始;到九月中旬第一個星期日的凌晨2時整(北京夏令時),再將時鐘撥回一小時,即將錶針由2時撥至1時,夏令時結束。從1986年到1991年的六個年度,除1986年因是實行夏時制的第一年,從5月4日開始到9月14日結束外,其它年份均按規定的時段施行。在夏令時開始和結束前幾天,新聞媒體均刊登有關部門的通告。1992年起,夏令時暫停實行。函數
所以在chrome
中轉換爲時間戳的時候,自己就少了一個小時的時間。ui
// chrome
new Date(1989, 4, 23).getTime() // 611852400000
// safari
new Date(611852400000) // Mon May 22 1989 23:00:00 GMT+0800 (CST) = $7
複製代碼
這時候咱們在消費這個時間戳的時候就很差判斷原有的時間是什麼了。僅僅針對生日這種特殊狀況來處理的話,由於上傳的時間確定是某日的零點的時間,所以,檢測是23
點的時候,咱們能夠加一個小時,可是除了這種特殊狀況咱們就很差處理了。spa
想要根治這種問題,咱們就須要在生產這個時間戳的時候就要針對夏令時作處理。好比說檢測new Date().toString()
中是否包含夏令時
或者+0900
這樣的字符串。若是有則說明進行了夏令時轉換。這時候咱們的時間戳就須要在原有的基礎上加上1h
的時間。或者使用momentjs
的檢測是否進行夏令時轉換函數判斷也能夠。code