🐍タイムゾーン付きの現在日時を取得する方法


はじめに

  • Pythonでタイムゾーン付きの現在日時を取得する方法をまとめてみた
  • 気になっていたpendulumパッケージを使ってみたかった

pendulum

>>> import pendulum
>>> now = pendulum.now()
>>> now.isoformat()
'2020-11-15T22:55:45.113366+09:00'

pytz

>>> import datetime
>>> import pytz
>>> tz = pytz.timezone('Asia/Tokyo')
>>> now = datetime.datetime.now(tz)
>>> now.isoformat()
'2020-11-15T22:55:45.113366+09:00'

datetime

>>> import datetime
>>> tz = datetime.timezone(datetime.timedelta(hours=9), 'Asia/Tokyo')
>>> now = datetime.datetime.now(tz)
>>> now.isoformat()
'2020-11-15T22:55:45.113366+09:00'

文字列に変換

自分で文字列を指定
>>> now.strftime('%Y-%m-%dT%H:%M:%S%z')
'2020-11-15T22:55:45+09:00'
pendulumは用途に合わせた変換フォーマットを持っている
>>> now.to_w3c_string()
'2020-11-15T22:55:45+09:00'
>>> now.to_datetime_string()
'2020-11-15 22:55:45'
>>> now.to_rss_string()
'Sun, 15 Nov 2020 22:55:45 +0900'

まとめ

  • デフォルトのdatetimeパッケージの場合、タイムゾーン情報はNoneになっている
    • タイムゾーンがないものをnaiveオブジェクトと呼ぶ
    • タイムゾーンがあるものをawareオブジェクトと呼ぶ
  • datetime.datetime.nowは引数にdatetime.tzinfoオブジェクトを指定できる
    • datetime.tzinfodatetime.timezoneもしくは pytz.timezoneで作成する
  • pendulum.nowは何も考えなくてもタイムゾーン付きの現在日時を得ることができる
    • 文字列に変換する場合もto_用途_string()の形で用途に合わせた変換フォーマットをいろいろを持っているのでとても便利
  • 今後はpendulumdatetimeの置き換えとして使ってみようと思う

各パッケージのドキュメント

実行した環境

>>> sys.version
'3.8.6 (default, Oct 27 2020, 08:57:44) \n[Clang 12.0.0 (clang-1200.0.32.21)]'
>>> pytz.__version__
'2020.4'
>>> pendulum.__version__
'2.1.2'