30DaysChallenge 是自主性每兩天寫一篇技術相關的部落格
Moment.js
相信這個套件大家都很熟悉! Date()甚麼的可以拋得遠遠啦!
雖然平常處理資料的時候很少用到時間,頂多是拿來排序
但如果想要自己做一個天氣、地圖、旅遊、金融
相關的專案
時間就會是一個很重要的資料
Unix TimeStamp
UNIX 時間,或稱 POSIX 時間是 UNIX 或類 UNIX 系統使用的時間表示方式:從 UTC1970 年 1 月 1 日 0 時 0 分 0 秒起至現在的總秒數,不考慮閏秒[1]。 –from wiki
在進入如何使用之前,先了解一下Unix TimeStamp
簡單來說,unix 的時間是就是從 1970/1/1 0:0:0 +0
開始一秒一秒算起,
且不論你人在哪個時區,顯示出來的 unix timestamp 都會是一樣
的。
瀏覽器打開 dev tools 用這個語法就可以簡單找到 unix timestamp
new Date() / 1000 //1628343662 這是我剛剛打出來的時間,以秒為單位
Date()
為何會提到 unix timestamp 呢?
剛剛找到合適的 API 時,發現時間的資料很…不一樣
"dt": 1628340495,
"sys": {
"type": 1,
"id": 9021,
"country": "RU",
"sunrise": 1628300863,
"sunset": 1628356792
},
"timezone": 10800,
簡單來說,
dt
: 時間日期 (unix timestamp)county
: 國家 (上述例子為俄羅斯)timezone
: 時區 (unix timestamp, +3 時區)
那如何進行轉換呢?
以下進行來跟 Date() 過個幾招
// 錯誤的,裡面要帶毫秒
new Date(1628340495)
Tue Jan 20 1970 04:19:00 GMT+0800 (台北標準時間)
// 正確,要使用毫秒,現在知道轉換過來的本地時間了
new Date(1628340495 * 1000)
Sat Aug 07 2021 20:48:15 GMT+0800 (台北標準時間)
那如何印出 +3 時區的時間呢?
有興趣的朋友可以自行於 dev tools 試試看,這邊就不演示碰壁的過程了 XD
Moment.js
這邊我們會利用手邊現有的資料,搭配 moment 快速 GET!
- now (unix timestamp)
- timezone (unix timestamp)
開始之前,再牢記一次
unix timestamp不管到哪裡都是唯一值,都代表同一個時間點
OK
直接進入程式碼
const userTime = moment.unix(current.data.dt).format()
const utcTime = moment.unix(current.data.dt).utc().format()
const localTime = moment
.unix(current.data.dt)
.utcOffset(current.data.timezone / 60)
.format()
2021-08-07T20:48:15+08:00 //userTime
2021-08-07T12:48:15Z //utcTime
2021-08-07T15:48:15+03:00 //localTime
~ format()
轉換成預設顯示的日期格式
-
userTime:
moment.unix()
填入 unix timestamp 再使用.format() 會得到當前使用者的地區的時間 -
utcTime: 加入
utc()
轉換為+0 時區 -
localeTime: 重點來了!! 套件的方便,就不用人肉計算到腦記憶體爆炸, 使用
utcOffset( min )
填入分鐘,透過預先得知的 timezone 資料將時間除 60 秒得到分鐘,套件就會幫你計算時區了。(正負有差,不要算錯惹)
moment 真的非常方便! 除了平常想要顯示特定的日期格式,轉換時區也是無障無礙。