忘れたころにハマるを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()
シリーズも同じ引数が使えるので、同じことが言える。