🧊

日付を`Intl.DateTimeFormat`でフォーマットするときは`timeZone`を忘れない

忘れたころにハマるを2回ほどやったなと思うので、書いておく・・・。

コード

const formatDate = (date) =>
  new Intl.DateTimeFormat("ja-JP", {
    dateStyle: "full",
    timeStyle: "long",
    timeZone: "Asia/Tokyo", // コレを忘れない
  }).format(date);

dateがUTCだとした場合の話で、それをJSTで表示したいよっていうよくあるケース。

timeZoneはオプショナルなので、省略できてしまうけど、してはいけない。

なぜか

ずばり、これを実行する環境によって、その結果が変わるから。

手元でDevToolsやNodeやBunで実行するときは、意図した通りの結果が返ってくる。 が、一度それがサーバーで動くことになると、

  • タイムゾーンの指定があればそれが使われてしまい
  • なければUTCになり、時差が反映されない

いずれにせよ、思ったとおりの表示ならない。

toLocaleString()シリーズも同じ引数が使えるので、同じことが言える。