🗺️

Day.js の tz 関数を使ったタイムゾーン設定の落とし穴と回避方法

2024/08/07に公開

結論から書くと、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)

参考

Discussion