datetime.now()
をローカル環境で実行したときは日本時間だったのにクラウド環境で実行したら UTC になるの、あるあるだと思います。
バグにつながるのを防ぐために事前に指定しておいたほうがよいです。
やりかた
環境が変わっても日本時間を取得するには zoneinfo を使います。(Python3.9以降)
参考:Python 公式ドキュメント zoneinfo --- IANA タイムゾーンのサポート
from zoneinfo import ZoneInfo
from datetime import datetime, timedelta
# ローカル環境から実行
dt = datetime(2020, 10, 31, 12)
print(dt) # 2020-10-31 12:00:00
dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
print(dt) # 2020-10-31 12:00:00-07:00
dt.tzname() # 'PDT'
dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("Asia/Tokyo"))
print(dt) # 2020-10-31 12:00:00+09:00
dt.tzname() # 'JST'
dt = datetime.now()
print(dt) # 2024-06-16 08:40:08.106375
dt = datetime.now(ZoneInfo("Asia/Tokyo"))
print(dt) # 2024-06-16 08:40:08.118271+09:00
dt = datetime.now(ZoneInfo("America/Los_Angeles"))
print(dt) # 2024-06-15 16:41:19.497516-07:00
日本で働いていると扱う機会が少ないと思いますがサマータイムを考慮することもできます。
fold が 1 であればサマータイムを考慮した時間, 0 であればサマータイム遷移前の時間を取得します。
# ロサンゼルスでは 2024年11月3日はサマータイム、11月4日は標準時
dt = datetime(2024, 11, 3, 1, tzinfo=ZoneInfo("America/Los_Angeles"))
print(dt) # 2024-11-03 01:00:00-07:00
print(dt.replace(fold=1)) # 2024-11-03 01:00:00-08:00
dt = datetime(2024, 11, 4, 1, tzinfo=ZoneInfo("America/Los_Angeles"))
print(dt) # 2024-11-04 01:00:00-08:00
print(dt.replace(fold=1)) # 2024-11-04 01:00:00-08:00