実際はズレているのではなく、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(日本標準時)を取得できるでしょう。