本文へスキップ

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)と要件を分けて設計する

関連リンク