後端通常日期會以 ISO String 回傳給前端,要前端自行根據 Timezone 顯示該時區正確時間,且日期格式又會根據客戶需求調整,這常見需求該如何實現呢 ?
Version
macOS Catalina 10.15.4
VS Code 1.43.2
Quokka 1.0.285
Date-fp 5.0.3
Date-fns 2.11.1
toLocaleString()
let s = '2020-04-02T11:30:00Z'
new Date(s).toLocaleString() // ?
最簡單方法是使用內建的 toLocaleString()
,它會自動根據目前 timezone 顯示正確時間,唯 format 可能不是我們想要的。
Date-fp
import { pipe } from 'ramda'
import { format } from 'date-fp'
import { date } from 'wink-fp'
let s = '2020-04-02T11:30:00Z'
let f = pipe(
date,
format('YYYY-MM-DD HH:mm:ss')
)
f(s) // ?
Date-fp 有提供 format()
,唯 Date-fp 將所有時間均視為 UTC 時間,因此其 format()
後格式是對了,但 timezone 不對。
Wink-fp 的
date()
只是new Date
的 function 化,適合 function pipeline
Date-fns
import { pipe } from 'ramda'
import { format } from 'date-fns/fp'
import { date } from 'wink-fp'
let s = '2020-04-02T11:30:00Z'
let f = pipe(
date,
format('yyyy-MM-dd HH:mm:ss')
)
f(s) // ?
Date-fns 所提供的 format()
就很理想,除了能轉成指定格式,也會自動轉成正確 timezone。
Conclusion
- 若想擁有 FP 的 curried function,且 data 放在最後一個 argument,過去 Date-fp 是首選,唯其
format()
只支援 UTC time 是遺憾之處,此時可改用 Date-fns 的format()
,依然可以繼續 function pipeline