ローカルでは完璧に動いていたのに、サーバーにデプロイした途端——。
「あれ、DBに記録された時間が9時間もズレてる……?」
初めてWebアプリやBotをクラウドにデプロイするとき、おそらく多くの人が遭遇するのがタイムゾーン問題。
対処法は簡単なので、サクッと解説します。
なぜ時間が「ぴったり9時間」ズレるのか?
原因はシンプルです。サーバーのOS時刻がUTC(協定世界時)に設定されているからです。

AWS・GCP・Heroku などのクラウドサービスや海外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'

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

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

まとめ
| 問題 | 原因 | 対策 |
|---|---|---|
| 時刻が9時間ズレる | サーバーのOSがUTC設定 | コード側でタイムゾーンを明示指定 |
ZoneInfoNotFoundError | WindowsにはIANAデータベースが無い | pip install tzdata |
デプロイ前のチェックリストに「タイムゾーン対応してるか?」を加えておくと、本番環境で焦ることがなくなります。


コメント