PR

【Python】サーバーにデプロイしたら時刻が9時間ズレた!タイムゾーン問題の原因と対処法

プログラミング

ローカルでは完璧に動いていたのに、サーバーにデプロイした途端——。

「あれ、DBに記録された時間が9時間もズレてる……?」

初めてWebアプリやBotをクラウドにデプロイするとき、おそらく多くの人が遭遇するのがタイムゾーン問題

対処法は簡単なので、サクッと解説します。

なぜ時間が「ぴったり9時間」ズレるのか?

原因はシンプルです。サーバーのOS時刻がUTC(協定世界時)に設定されているからです。

タイムゾーンのずれ

AWSGCPHeroku などのクラウドサービスや海外VPSは、OSのタイムゾーンがデフォルトで UTC(UTC+0:00) になっています。

一方、日本標準時(JST)は UTC+9:00。差し引き9時間のズレが生じる、という仕組みです。

アプリ内で「現在時刻を取得」するとサーバーOSの時刻(UTC)が返ってくるため、日本時間より9時間遅れた値がDBに記録されてしまいます。

PythonでJST(日本時間)を正しく取得する

OS設定に依存しないようにするには、Pythonコード側でタイムゾーンを明示的に指定するのが正解です。

Python 3.9以降であれば、標準ライブラリの zoneinfo を使うのがベストです。
以前よく使われていた pytz はすでに非推奨になりつつあり、新規コードへの採用は避けた方が無難です。

from datetime import datetime
from zoneinfo import ZoneInfo

# OSのタイムゾーン設定に関係なく、確実にJSTで取得する
dt = datetime.now(ZoneInfo("Asia/Tokyo"))
print(dt)
# 出力例: 2026-04-08 15:30:00.123456+09:00

ZoneInfo("Asia/Tokyo") を渡すだけで、サーバー・ローカルを問わず日本時間が取れます。シンプルかつ標準的な方法なので、積極的に使っていきましょう。

タイムゾーン識別子("Asia/Tokyo" など)の正式な一覧は IANA Time Zone Database で確認できます。

【Windows限定の罠】ZoneInfoNotFoundError が出る場合

上のコードをWindowsのローカル環境で動かすと、こんなエラーが出ることがあります。

zoneinfo._common.ZoneInfoNotFoundError: 'No time zone found with key Asia/Tokyo'
ZoneInfoNotFoundError

なぜWindowsだけ?

zoneinfo は内部でOSが持つ IANAタイムゾーンデータベース を参照します。LinuxやmacOSにはこのデータベースが標準搭載されていますが、Windowsには存在しません。そのため「Asia/Tokyo なんて知らない」とエラーになります。

以下のようにUbuntuなどではタイムゾーンデータが存在します。

tzdata

解決策:tzdata をインストールする

Pythonの公式が提供するタイムゾーンデータパッケージ tzdata を入れるだけで解決します。

pip install tzdata
installed tzdata

まとめ

問題原因対策
時刻が9時間ズレるサーバーのOSがUTC設定コード側でタイムゾーンを明示指定
ZoneInfoNotFoundErrorWindowsにはIANAデータベースが無いpip install tzdata

デプロイ前のチェックリストに「タイムゾーン対応してるか?」を加えておくと、本番環境で焦ることがなくなります。

参考リンク

コメント

タイトルとURLをコピーしました