JavaScript 多8小時是指在某些特定情況下(如使用 Date 對象進行時間計算)JavaScript 所得到的時間會比實際時間多出8個小時。主要原因是因為 JavaScript 內置的時間處理庫默認使用的是 UTC 時間,而中國所處的東八區時區與 UTC 時間相差8小時造成的。
比如我們使用 Date 對象來獲取當前時間:
let now = new Date(); console.log(now);
在中國上海的計算機上執行上述代碼,輸出結果為:
Thu Apr 15 2021 14:12:36 GMT+0800 (中國標準時間)
可以看到,輸出結果中的 “GMT+0800” 表示當前時間處于東八區時區。然而,在進行時間計算時,JavaScript 默認使用 UTC 時間,而不是本地時間。比如,如果要計算凌晨2點到現在的時間差(單位為毫秒),可以這樣寫:
let now = new Date(); let twoOClock = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 2, 0, 0); let diff = now.getTime() - twoOClock.getTime(); console.log(diff);
在中國上海的計算機上執行上述代碼,輸出結果為:
40800000
可以看到,輸出結果表示距離凌晨2點已經過去了 40800000 毫秒,即 11 小時 20 分鐘。然而,實際上距離凌晨2點過去的時間應該只有 12 分鐘。這就是因為計算時間差時,JavaScript 默認使用 UTC 時間,所以結果會比實際時間多出8個小時。
解決這個問題的方法很簡單,即在進行時間計算時,將本地時間轉換為 UTC 時間??梢酝ㄟ^以下代碼實現:
let now = new Date(); let twoOClock = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 2, 0, 0); let diff = now.getTime() - twoOClock.getTime() - now.getTimezoneOffset() * 60 * 1000; console.log(diff);
其中的 now.getTimezoneOffset() 方法用于獲取當前時區與 UTC 時間的差距(單位為分鐘),乘以60*1000 轉換為毫秒。執行上述代碼,可以得到正確的時間差(12 分鐘)。
除了時間計算外,JavaScript 還有一些與時間相關的函數會受到多8小時問題的影響。比如,new Date() 方法的參數傳遞,toLocaleString() 方法的時間格式化等等。解決這些問題的方法也基本相同,即在需要進行時間轉換的地方手動添加時區差(以分鐘為單位)即可。關于 JavaScript 時間處理的更多問題,可以參考 MDN 的文檔。