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 จากสตริง...

ตัวอย่างหลาม 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 ฉันไม่ได้ติดตั้ง Python 3.6 บนเดสก์ท็อป แต่มีการติดตั้งบนเซิร์ฟเวอร์ ดังนั้นฉันจึงใช้ python3.5 ของฉัน แต่ฉันยังตรวจสอบบนเซิร์ฟเวอร์ด้วย python3.6 และมันก็มีปัญหาเดียวกัน   -  person DarkSuniuM    schedule 14.11.2018
comment
@ user2357112 เพิ่ม Python 3.6 Traceback เช่นกัน   -  person DarkSuniuM    schedule 14.11.2018


คำตอบ (1)


โอเค หลังจากผ่านไป 2 วัน ฉันได้ตรวจสอบบันทึกการเปลี่ยนแปลง Python 3.7 และพบว่า รองรับ Z เนื่องจากมีการเพิ่มออฟเซ็ต UTC ใน Python 3.7 ดูปัญหานี้ในตัวติดตามปัญหา Python ซึ่งเกี่ยวกับการเพิ่มการรองรับโคลอนเป็นหลัก แต่ยังกล่าวถึง Z support ด้วย ต่อไปที่ด้านล่างของหน้า โปรดดูที่ 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 โดยฮาร์ดโค้ดออฟเซ็ต

person DarkSuniuM    schedule 14.11.2018