JavaScriptの日時とタイムゾーン超入門(getDayがズレる理由)
・対象: 初心者,中級者・タグ: JavaScript, Date, TimeZone, getDay, テスト, JST, UTC, internal, archived
JavaScript で日時を扱うとき、タイムゾーンの違いで「getDay()」の値がズレることがあります。なぜでしょう?
対象読者: JS で日時/曜日を扱うフロント/バックエンド開発者、テスト整備担当。
この記事で得られること: getDay のズレが起きる仕組みと、Intl/timeZone 指定、テストの TZ 固定手法が分かります。
用語ミニ辞典(簡易)
- ローカルタイムゾーン: 実行環境の既定 TZ。Date はこれに依存
- UTC: 協定世界時。テスト固定やログ基準に便利
- Intl.DateTimeFormat: 任意 TZ での表示を実現する API
Date の基礎
Date オブジェクトは常に「ローカルタイムゾーン」を基準に動作します。
Intl+timeZone
Intl.DateTimeFormatを使うと、任意のタイムゾーンで日時を表示できます。
const d = new Date('2025-09-16T00:00:00Z')
const fmt = new Intl.DateTimeFormat('ja-JP', { timeZone: 'Asia/Tokyo', weekday: 'short' })
console.log(fmt.format(d)) // JSTでの曜日
UTC と JST
UTC と JST で同じ Date でも曜日が異なる場合があります。
テストの TZ 非依存化
テスト時は TZ=UTC など環境変数でタイムゾーンを固定しましょう。
まとめ
- getDay のズレは TZ 差異が原因。Intl で表示 TZ を明示する
- テストは TZ 固定(CI/ローカル差異を抑制)
- 仕様(UTC/JST)と要件を分けて設計する