在前端有時候需要操作顯示時間的問題,通常都與時區有關導致顯示的日期有一天的差距;由於看過太多錯誤的解法(即便是stackoverflow),甚至有些單純想依靠moment.js來解決問題的建議其實都不太正確,筆記一下正確處理的方式。
首先,我們要先拿個時間物件:
let now = new Date("2019-01-23");
/* Ex. Tue Jan 22 2019 16:00:00 GMT-0800 (Pacific Standard Time) */
你會看到每個時區相對應得到的時間日期並不相同,但這不是bug,而是前端工程師的日常,這也是發生日期時間差的主因。
所以到底怎麼轉換日期date變成UTC time才是正確的,其實很簡單,先取得計算過後的秒數 milliseconds ,再加上相對應的時間差 offset,再將他轉換回時間物件就可以得到正確的local date。
let nowUtc = new Date( now.getTime() + (now.getTimezoneOffset() * 60000) );
/* Wed Jan 23 2019 00:00:00 GMT-0800 (Pacific Standard Time) */
特別提一下是 getTimezoneOffset ,這個func回傳的單位是分鐘,這也是為什麼我們要將該值再乘以60000的原因,因為一分鐘有60秒,一秒是1000毫秒。
The
getTimezoneOffset()
method returns the time zone difference, in minutes, from current locale (host system settings) to UTC.
以上報告。