トラブルシュート

日付・時刻がずれるときの対処(タイムゾーン)

予約日時やイベント時刻が9時間ずれる、日付が1日前後する。こうしたバグの大半は、UTCとローカル時刻のどちらで扱っているかが揃っていないことが原因です。この記事では、タイムゾーンの基本を押さえ、ずれが起きる典型パターンと直し方を整理します。

UTCとローカル時刻の関係を押さえる

UTCは世界共通の基準となる時刻で、日本のローカル時刻(JST)はUTCより9時間進んでいます。プログラムの内部では時刻をUTCで持ち、表示するときだけ閲覧者のローカル時刻に変換するのが基本です。

ずれの典型は、UTCのつもりの値をローカル時刻として解釈してしまう、あるいはその逆です。9時間という分かりやすい差が出たら、まずUTCとJSTの取り違えを疑ってください。

日付が1日ずれる現象も根は同じです。たとえば日本時間の午前0時台はUTCではまだ前日のため、日付だけを切り出すと1日前にずれることがあります。

  • 内部では UTC で持つ、表示時にローカルへ変換する
  • 9時間ちょうどのずれ → UTC と JST の取り違え
  • 日付が1日ずれる → 日付部分だけを切り出した変換ミス

文字列のパースで起きるずれ

日時の文字列をプログラムに渡すとき、フォーマットによって解釈が変わります。年月日だけの形式は環境によってUTC基準で解釈されることがあり、時刻部分まで含む形式はローカル基準で解釈されることがあります。同じ値のつもりが、入力の書き方で結果がずれてしまいます。

ずれを避けるには、タイムゾーンを明示したISO 8601形式(末尾にZやプラスマイナスのオフセットが付く形)で受け渡すのが安全です。曖昧な文字列を避けるだけで、多くのずれは消えます。

症状別チェック表

日付・時刻がずれるは、症状を分けずに直そうとすると原因探しが長引きます。まず「自分だけで起きるのか」「全員で起きるのか」「特定ブラウザだけか」「差し替え後だけか」を切り分けます。

確認順序を固定すると、相対パス、ファイル名、キャッシュ、認証、外部読み込みのどこで止まっているかが見えます。修正後はローカル確認だけで終わらせず、実際の共有URLで再表示して、相手と同じ条件で直ったことを確認します。

  • 自分だけ表示されない: キャッシュ、ログイン状態、ブラウザ拡張、端末幅を確認する
  • 全員で表示されない: ファイル構成、相対パス、大文字小文字、アップロード漏れを見る
  • 一部だけ崩れる: CSS/画像/JSごとに読み込みエラーを分ける
  • 差し替え後だけ古い: URL、キャッシュ、更新対象ファイルの取り違えを確認する

保存と表示で基準を揃える

データを保存するときはUTCで統一し、画面に出すときに閲覧者のタイムゾーンへ変換する、という一貫した方針を決めると混乱しません。保存はローカル、表示もローカルだが変換を忘れる、といった場当たり的な扱いがずれを生みます。

サーバーやビルド環境のタイムゾーン設定にも注意が必要です。実行環境がJSTかUTCかで、ログや生成される日時が変わることがあります。環境に依存せず、コード側で明示的に変換するのが安全です。

ずれの切り分け手順

日時がおかしいときは、次の順で確認すると原因を絞り込めます。

  1. ずれ幅を測る(9時間ちょうどならUTC/JST取り違え、1日なら日付切り出しを疑う)
  2. 元データがUTCで保存されているか確認する
  3. 受け渡す文字列をタイムゾーン明示のISO 8601形式に揃える
  4. 表示処理で意図したタイムゾーンへ変換しているか確認する
  5. 実行環境のタイムゾーン設定に依存していないか見直す

閲覧者の環境で確認するには

時刻のずれは、開発者の手元では出ないのに、別の環境やタイムゾーンの閲覧者で初めて顕在化することがあります。実際に配信されたページを、関係者それぞれの端末で開いてもらって確認すると、思わぬずれに気づけます。

ギガサイト便にHTMLをドロップすると 〇〇.giga-site.com のhttpsの共有URLが発行され、関係者に渡してそれぞれの環境で表示を確認してもらえます。修正したら同じURLのままファイルを差し替えられるので、リンクを送り直さずに「直ったか」を再確認してもらえます。アクセスログで誰がいつ見たかも残せます。

よくある質問

時刻がちょうど9時間ずれます。

UTCとJST(日本時間)の取り違えが典型です。UTCの値をローカル時刻として解釈している、またはその逆になっていないか確認してください。内部はUTCで持ち、表示時にローカルへ変換する方針に揃えると安定します。

日付だけが1日ずれます。

日本時間の午前0時台はUTCではまだ前日のため、日付部分だけを切り出すと1日前後することがあります。時刻まで含めてタイムゾーンを意識して変換してください。

日時の文字列はどう渡すのが安全ですか。

タイムゾーンを明示したISO 8601形式(末尾にZやオフセットが付く形)が安全です。年月日だけの曖昧な形式は環境によって解釈が変わり、ずれの原因になります。

開発環境では正しいのに公開すると違います。

実行環境のタイムゾーン設定の違いが影響している可能性があります。環境に依存せずコード側で明示的に変換し、実際に配信したページを複数の環境で開いて確認してください。

原因が分からないときはどこから確認すべきですか?

まず自分だけの問題か全員の問題かを分けます。次にシークレットウィンドウ、別ブラウザ、スマホで確認し、ファイル構成・相対パス・キャッシュ・認証設定を順に見ます。

関連記事

トラブルシュート

公開後にJavaScriptが動かないときの原因と直し方

ローカルでは動いていたボタンやアニメーションが公開後に反応しなくなった方向け。JavaScriptが止まる主な原因をファイルパスや読み込み順の観点で切り分け、自分で直せるかどうかを判断できます。

5分で読める
トラブルシュート

公開後に動画が再生されないときの対処

デモページや資料に埋め込んだ動画が公開後に再生されなくなった方向け。動画ファイルの添付漏れ・パスのズレ・ブラウザの自動再生制限を症状ごとに切り分け、自分でできる確認と対処を把握できます。

4分で読める
トラブルシュート

公開したHTMLのフォームが送信できないときの対処

問い合わせフォームやアンケートの送信ボタンが押せない・エラーになる方向け。静的ファイル公開ではフォームの動作に制約がある理由を理解し、外部サービス連携などの現実的な解決策を選べるようになります。

5分で読める
トラブルシュート

iframeが表示されないときの原因と対処

地図や外部コンテンツをiframeで埋め込んだのに公開後に枠が空白になった方向け。表示許可・HTTPSとHTTPの混在・相対パスのズレを症状ごとに切り分け、適切な対処を選べるようになります。

4分で読める
トラブルシュート

外部CDNのCSS・JSが読み込めないときの対処

CDNからCSSやJSを読み込む構成にしたらデザインが崩れて機能が動かなくなった方向け。URLの誤りやHTTPSの混在・バージョン指定の問題を原因ごとに整理し、確認と修正の手順を把握できます。

5分で読める
「トラブルシュート」の記事をもっと見る →