タイムゾーン対応の文字列をpython datetime
オブジェクトに変換する必要があります。
例えば 2012-11-01T04:16:13-04:00
。
それを行うための解析関数を持っているdateutil
モジュールがありますが、依存関係が追加されるため、実際には使用したくありません。
どうすればそれができますか?私は次のようなものを試しましたが、運がありません。
datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")
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は、リリースサイクルをはるかに高速化できる外部ライブラリを使用して、適切に構成されたタイムゾーンを提供します。
副作用として、これはタイムゾーンparsingも外部ライブラリである必要があることを意味します。 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
はwhopping4KB小さいです。その合計python-dateutil
の148KBを比較します。
Python 3.2 Python)canは、単純なオフセットベースのタイムゾーンを処理し、 %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)))
適切なISO 8601解析の欠如は Python issue 1587 で追跡されています。
以下は、dateutilパッケージを使用したdatetimeオブジェクトのPython Doc です。
from dateutil.parser import parse
get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj
元の質問のコードには2つの問題があります::
のタイムゾーンと"オフセットとしてのタイムゾーン"のフォーマット文字列は小文字の%z
上部ではありません%Z
。
これはPython v3.6で動作します
>>> from datetime import datetime
>>> t = datetime.strptime("2012-11-01T04:16:13-0400", "%Y-%m-%dT%H:%M:%S%z")
>>> print(t)
2012-11-01 04:16:13-04:00
私はPythonは初めてですが、変換する方法を見つけました
2017-05-27T07:20:18.000-04:00
に
2017-05-27T07:20:18
新しいユーティリティをダウンロードせずに。
from datetime import datetime, timedelta
time_zone1 = int("2017-05-27T07:20:18.000-04:00"[-6:][:3])
>>returns -04
item_date = datetime.strptime("2017-05-27T07:20:18.000-04:00".replace(".000", "")[:-6], "%Y-%m-%dT%H:%M:%S") + timedelta(hours=-time_zone1)
文字列をあまりスライスせずにこれを行うより良い方法があると確信していますが、これで仕事は完了しました。
このように変換できます。
date = datetime.datetime.strptime('2019-3-16T5-49-52-595Z','%Y-%m-%dT%H-%M-%S-%f%z')
date_time = date.strftime('%Y-%m-%dT%H:%M:%S.%fZ')