タイムゾーンに対応した文字列を"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。