Python 3.6 DateTime Strptime返回错误,而Python 3.7正常运行

时间:2018-11-14 00:02:57

标签: python datetime python-3.6 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'

太奇怪了,是什么原因引起的?我该如何解决?

1 个答案:

答案 0 :(得分:4)

好吧,两天后,我检查了Python 3.7 changelog,发现对Z的支持是因为Python 3.7中添加了UTC偏移量。请在Python问题跟踪器上查看此issue,这主要是关于添加对冒号的支持,但在页面的下方还提到了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,对偏移量进行了硬编码。