🗓️

dayjs の デフォルトタイムゾーンが効いてない?って思ったときに確認すること

2023/02/28に公開

はじめに

UTCで保存されている日時を日本時間で表示したいときに、毎回タイムゾーン指定したくないので、初期処理でdayjs.tz.setDefault("Asia/Tokyo") ってすると思うんですが、それが効くときと効かないときがあるよという話です。

結論

UTCAsia/Tokyoにしたいのであれば、
dayjs("2023-01-23 00:00:00") とせずに、
dayjs("2023-01-23T00:00:00Z") もしくは、
dayjs("2023-01-23T00:00:00+00:00") とすると、
2023-01-23 09:00:00 になります。
タイムゾーンがUTCであることを明示しないと、そもそもタイムゾーン変換しようがないよということなんでしょう。

試したこと

import dayjs from 'dayjs'
import 'dayjs/locale/ja'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'

dayjs.extend(utc)
dayjs.extend(timezone)

dayjs.tz.setDefault("Asia/Tokyo")
dayjs.locale('ja')

// "2023-01-23 00:00:00 => 2023-01-23 00:00:00"
console.log("2023-01-23 00:00:00 => " + dayjs("2023-01-23 00:00:00").format('YYYY-MM-DD HH:mm:ss'))
// "2023-01-23T00:00:00Z => 2023-01-23 09:00:00"
console.log("2023-01-23T00:00:00Z => " + dayjs("2023-01-23T00:00:00Z").format('YYYY-MM-DD HH:mm:ss'))
// "2023-01-23T00:00:00+09:00 => 2023-01-23 00:00:00"
console.log("2023-01-23T00:00:00+09:00 => " + dayjs("2023-01-23T00:00:00+09:00").format('YYYY-MM-DD HH:mm:ss'))
// "2023-01-23T00:00:00+00:00 => 2023-01-23 09:00:00"
console.log("2023-01-23T00:00:00+00:00 => " + dayjs("2023-01-23T00:00:00+00:00").format('YYYY-MM-DD HH:mm:ss'))

詳しくは、以下を参照ください。
https://codepen.io/imunew/pen/yLxgYpy

おわりに

意外にこの挙動について説明してくれている記事が見つからなかったんで書いてみました。
誰かのお役に立てますように。
ではでは。

Discussion