🗺️
Day.js の tz 関数を使ったタイムゾーン設定の落とし穴と回避方法
結論から書くと、Day.js で指定したタイムゾーンの時刻を取得したい場合は、dateObject ではなく date の文字列を設定しましょうという主張です。指定したタイムゾーンの時刻を取得したい場合に dateObject を設定すると期待した値が返ってこないので注意です。
// Pacific/Honoluluのタイムゾーンの2023-12-25 00:00:00を返す。
dayjs.tz("2023-12-25 00:00:00", "Pacific/Honolulu").format("YYYY-MM-DDTHH:mm:ssZ")
=> "2023-12-25T00:00:00-10:00"
// Pacific/Honoluluのタイムゾーンの2023-12-25 00:00:00を返して欲しかったのですが、そうなっていない...
dayjs.tz(new Date('2023-12-25 00:00:00'), "Pacific/Honolulu").format("YYYY-MM-DDTHH:mm:ssZ")
=> "2023-12-24T05:00:00-10:00"
なお、Day.js の tz 関数は他にも使い方があり、以下の4つのパターンが記載できます。
// [記法1] dateTimeString を timezone に変換
dayjs(dateTimeString).tz(timezone)
// [記法2] dateTimeString を timezone でパース
dayjs.tz(dateTimeString, timezone)
// [記法3] dateObject を timezone に変換(記法2に似てますが、記法1と同じ結果なので注意が必要)
dayjs.tz(dateObject, timezone)
// [記法4] dateTimeStringをcustomParseFormatで解析して、timezoneでパース
dayjs.tz(dateTimeString, customParseFormat, timezone)
参考
- 公式ドキュメント: Time Zone、Parsing in Zone、Converting to Zone
- 元々私が書いた記事: Day.jsのタイムゾーンを扱う関数 tz のドキュメントにない注意点を整理 少し長かったので、短くしています。
Discussion