點燈坊

失くすものさえない今が強くなるチャンスよ

使用 format() 自訂日期顯示格式

Sam Xiao's Avatar 2020-04-03

後端通常日期會以 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 可能不是我們想要的。

format000

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

format001

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。

format002

Conclusion

  • 若想擁有 FP 的 curried function,且 data 放在最後一個 argument,過去 Date-fp 是首選,唯其 format() 只支援 UTC time 是遺憾之處,此時可改用 Date-fns 的 format(),依然可以繼續 function pipeline

Reference

Date-fp, format()
Date-fns, format()