ブログサイトをNext.jsで開発している最中だが,以下の問題が発生している.前提として,DBから取得した同じ日時データを編集ページ,閲覧ページで表示しており,閲覧ページでのみ時間が-9時間分ずれているという事象が発生した.
編集ページ:日本時間で表示 12/17 18:00と表示.クライアントコンポーネント
閲覧ページ:UTCで表示,12/17 9:00と表示.サーバーコンポーネント
DB: ISO表記,UTCでtimestampを保持.
9時間ずれはタイムゾーンのせいなんだけど,ロジックは同じなのに閲覧ページでのみずれているのが味噌.
9割がた,編集ページと閲覧ページの実行環境が異なることが原因と判断.
一応,VercelのデプロイregionはTokyoだし,Vercel上でのデプロイログのタイムスタンプもJSTだったので,Vercelのサーバー環境はUTCになっているということなのだろう.
https://blog.junpeko.com/blogs/consider_vercel_timezone
https://zenn.dev/kohki_s/articles/a77ac4badf0f3c
JSのDate APIは実行環境のタイムゾーン依存だったり,挙動が厄介なところが多々あるのであまり信用ならない.
ちなみに,解決策は以下の通り
JavaScriptのDate APIのtoLocalString()を以下のように適切に呼び出すことで解決した.
// ❌修正前
// "ja-JP"を渡せば,timeZoneが日本に設定されていると勘違いしていた
// →正しくはその国における標準的な時間表記にフォーマットしてするだけ
const japanTime=date.toLocaleString("ja-JP")
// ✅修正後
// timezoneを設定したければ別でtimezoneをobjectとして渡す必要がある
const japanTime=date.toLocaleString("ja-JP",{timeZone: 'Asia/Tokyo'})