📅

Vercel SSRはデフォルトでTimezoneがUTCになるので注意

2022/08/15に公開

Astroで遊んでいたら、Vercel(SSR)でday.jsでパースした日付が少しだけ前の時間になっていたので「ああ、こらタイムゾーンがおかしいでんな」と思い、修正しました。

Astroは良いです。Astroは公式でVercelのSSRに対応しています。Astroの良さについては、またどこかで機会があれば紹介したいと思います。

day.jsでタイムゾーンを指定してあげる

original source(old)

index.astro
---
import dayjs from dayjs
dayjs.locals('ja') // Set locale Japan to display japanese date

const response = await fetch(`https://somethingapi.example.com/`)
const data = await response.json()
const pubDate = data.pubDate
---
<time>{dayjs(pubDate).format('YYYY年M月D日(ddd) HH:mm'}</time>

↑これだと、日本でローカル開発している分には問題ないのですが、Vercel(SSR)にアップすると、9時間前の時刻で表示されます。

modified source(new)

index.astro
---
import dayjs from dayjs
+import utc from 'dayjs/plugin/utc' // Add
+import timezone from 'dayjs/plugin/timezone' // Add
dayjs.locals('ja') // Set locale Japan to display japanese date
+dayjs.extend(utc) // Add
+dayjs.extend(timezone) // Add

const response = await fetch(`https://somethingapi.example.com/`)
const data = await response.json()
const pubDate = data.pubDate
---
-<time>{dayjs(pubDate).format('YYYY年M月D日(ddd) HH:mm'}</time>
+<time>{dayjs(pubDate).tz('Asia/Tokyo').format('YYYY年M月D日(ddd) HH:mm'}</time><!-- Modified -->

↑これで正しく表示されました!

参考:Day.jsの.tz.setDefault()が動かないと思ったけど使い方が間違ってただけだった

余談

早くシンタックスハイライトが、astroファイル記法に対応するといいなー

Discussion