dateutil を使用せずに Python でタイムゾーン対応文字列を datetime に変換するにはどうすればよいでしょうか? 質問する

dateutil を使用せずに Python でタイムゾーン対応文字列を datetime に変換するにはどうすればよいでしょうか? 質問する

タイムゾーンに対応した文字列を"2012-11-01T04:16:13-04:00"Pythondatetimeオブジェクトに変換する必要があります。

解析機能を持つモジュールを見ましたがdateutil、依存関係が追加されるため、実際には使用したくありません。

それで、どうすればいいのでしょうか? 次のようなことを試してみましたが、うまくいきませんでした。

datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")

ベストアンサー1

Python 3.7 以降では、datetime.datetime.fromisoformat()次の形式を処理できます。

>>> import datetime
>>> datetime.datetime.fromisoformat('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))

古いバージョンの Python では、手動でタイムゾーンを定義するという面倒な作業を行わなければ、これは不可能です。

Python にはタイムゾーン データベースが含まれていません。すぐに古くなるためです。代わりに、Python は、リリース サイクルがはるかに速い外部ライブラリを使用して、適切に構成されたタイムゾーンを提供します。

副作用として、タイムゾーンが解析外部ライブラリも必要です。dateutil重すぎる場合は、iso8601代わりに、特定の形式を問題なく解析します。

>>> import iso8601
>>> iso8601.parse_date('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=<FixedOffset '-04:00'>)

iso8601なんと4KB 小さいです。148KB と比較してくださいpython-dateutil

Python 3.2以降 Pythonできるシンプルなオフセットベースのタイムゾーンを処理し、タイムスタンプ内のタイムゾーンオフセットを%z解析します。つまり、ISO 8601 タイムスタンプの場合は、タイムゾーン内の を削除する必要があります。-hhmm+hhmm:

>>> from datetime import datetime
>>> iso_ts = '2012-11-01T04:16:13-04:00'
>>> datetime.strptime(''.join(iso_ts.rsplit(':', 1)), '%Y-%m-%dT%H:%M:%S%z')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000)))

適切なISO 8601解析の欠如は、Python の問題 15873

おすすめ記事