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小さいです。そのtotpython-dateutil
の148KBを比較してください。
Python 3.2以降、Pythonは単純なオフセットベースのタイムゾーンを処理でき、タイムスタンプのタイムゾーンオフセット%z
を解析-hhmm
します。+hhmm
つまり、ISO 8601タイムスタンプの場合:
、タイムゾーン内のを削除する必要があります。
>>> 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)))
適切なISO8601解析の欠如は、 Pythonの問題15873で追跡されています。