サーバとPythonで時刻がズレているように見える

実際はズレているのではなく、PythonのdatetimeモジュールがUTC(協定世界時)で現在時刻を取得しているかもしれません。

背景

Python3.9から3.10にアップグレードしたところ、CRONで設定したコマンドが正常に動かなくなりました。調べたところPythonの時間が9時間遅くなっていることに気がつきました。

環境はXserverにHomebrewでPythonを入れています。

[xserver ~]$ python3
Python 3.10.8 (main, Oct 11 2022, 11:35:05) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2022, 12, 9, 5, 44, 34, 713996)
>>> quit()

[xserver ~]$ date
2022年 12月  9日 金曜日 14:45:52 JST

Pythonの時刻が9時間遅れているように見えますね。

解決策1

9時間の差というのはUTC(協定世界時)とJST(日本標準時)の差です。PythonのdatetimeがUTCを取得している状態なので、UTCに9時間を足してJSTに換算します。

[xserver ~]$ python3
Python 3.10.8 (main, Oct 11 2022, 11:35:05) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> now = datetime.datetime.now() + datetime.timedelta(hours=+9)
>>> now
datetime.datetime(2022, 12, 9, 15, 5, 48, 858869)
>>> quit()

[xserver ~]$ date
2022年 12月  9日 金曜日 15:06:14 JST

無事にPythonでJST(日本標準時)を取得できました。

解決策2

解決策1はdatetimeモジュールで取得する現在時刻がUTC(協定世界時)であることが前提です。もし何かの拍子にJST(日本標準時)を取得するようになったら今度は9時間進んでしまうので、いつもUTC(協定世界時)を取得するようにした方が安全ですね。

[xserer ~]$ python3
Python 3.10.8 (main, Oct 11 2022, 11:35:05) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> now = datetime.datetime.utcnow() + datetime.timedelta(hours=+9)
>>> now
datetime.datetime(2022, 12, 9, 15, 25, 32, 22651)
>>> quit()

[xserver ~]$ date
2022年 12月  9日 金曜日 15:26:39 JST

これでPythonで確実にJST(日本標準時)を取得できるでしょう。

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