web-dev-qa-db-ja.com

Python 3.6 DateTime Strptimeはエラーを返しますが、Python 3.7は正常に機能します

日付データのデータ型を作成しました。これはdatetime.datetimeオブジェクトを返します。

コードは次のとおりです。

import datetime


class Date:
    def __new__(cls, dateTime, *args, **kwargs):
        return datetime.datetime.strptime(dateTime, "%Y-%m-%dT%H:%M:%S.%f%z")

したがって、このクラスに ISO-8601 を与えるたびに、文字列から日時オブジェクトを返す必要があります。

Python 3.7の例:

Date("2018-12-09T08:56:12.189Z")                                        
# Returns => datetime.datetime(2018, 12, 9, 8, 56, 12, 189000, tzinfo=datetime.timezone.utc)

これは非常にうまく機能しますが、Python 3.6またはPython 3.5:

# Python 3.5 Traceback
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/_strptime.py", line 510, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "/usr/lib/python3.5/_strptime.py", line 343, in _strptime
    (data_string, format))
ValueError: time data '2018-12-09T08:56:12.189Z' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'

# Python 3.6 Traceback
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/_strptime.py", line 565, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "/usr/lib/python3.6/_strptime.py", line 362, in _strptime
    (data_string, format))
ValueError: time data '2018-12-09T08:56:12.189Z' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'

それはとても奇妙です、何が問題を引き起こしますか?どうすれば修正できますか?

7
DarkSuniuM

2日後、 Python 3.7の変更ログ を確認したところ、UTCオフセットがPython 3.7)に追加されたため、Zがサポートされていることがわかりました。 。Python Issue Trackerでこの issue を参照してください。これは主にコロンのサポートの追加に関するものですが、ページのさらに下のZサポートについても言及しています。 datetime docs も参照してください。

バージョン3.7で変更:%zディレクティブがstrptime()メソッドに提供されている場合、UTCオフセットは時間間の区切り文字としてコロンを持つことができます。分と秒。たとえば、「+ 01:00:00」は1時間のオフセットとして解析されます。 さらに、「Z」の指定は「+00:00」と同じです。

私のクラスでは、時間形式を次のように変更する必要がありました。

datetime.datetime.strptime(dateTime, "%Y-%m-%dT%H:%M:%S.%fZ")

最後の%zZに変更し、オフセットをハードコーディングしました。

11
DarkSuniuM