LoginSignup
1
1
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

python の datetime で zoneinfo を使って環境が変わっても特定のタイムゾーンの時間を取得する

Posted at

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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1