Python 3.6 DateTime Strptime Возвращает ошибку, в то время как Python 3.7 работает хорошо - PullRequest
0 голосов
/ 14 ноября 2018

Я только что создал тип данных для своих данных даты, который возвращает 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)

Это работает чертовски хорошо, но когда я использую его на Python3.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'

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

1 Ответ

0 голосов
/ 14 ноября 2018

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...