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, он должен возвращать объект datetime из строки...

Пример 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'

Это так странно, в чем причина проблемы? Как я могу это исправить?


person DarkSuniuM    schedule 14.11.2018    source источник
comment
Вы говорите, что Python 3.6 использует модули из Python 3.5. Это проблема.   -  person user2357112 supports Monica    schedule 14.11.2018
comment
@user2357112 user2357112 У меня не был установлен Python 3.6 на моем рабочем столе, но он был установлен на сервере, поэтому я использовал свой python3.5, но я также проверил его на сервере с python3.6, и у него была та же проблема.   -  person DarkSuniuM    schedule 14.11.2018
comment
@user2357112 user2357112 Также добавлен Python 3.6 Traceback   -  person DarkSuniuM    schedule 14.11.2018


Ответы (1)


Хорошо, через 2 дня я проверил журнал изменений Python 3.7 и обнаружил поддержка Z в качестве смещения UTC была добавлена ​​в Python 3.7. См. эту проблему в системе отслеживания проблем Python, в которой в основном говорится о добавлении поддержки двоеточий, но также упоминается поддержка Z. далее вниз по странице. Также см. datetime docs, в которых говорится

Изменено в версии 3.7: когда директива %z предоставляется методу strptime(), смещения UTC могут иметь двоеточие в качестве разделителя между часами, минутами и секундами. Например, «+01:00:00» будет проанализировано как смещение в один час. Кроме того, предоставление "Z" идентично "+00:00".

В моем классе мне пришлось изменить формат времени на это:

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

Я изменил %z в конце на Z, жестко запрограммировав смещение.

person DarkSuniuM    schedule 14.11.2018