Python 3.6 DateTime Strptime Mengembalikan kesalahan sementara Python 3.7 berfungsi dengan baik

Saya baru saja membuat tipe data untuk data tanggal saya, yang mengembalikan objek datetime.datetime

Ini kodenya:

import datetime


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

Jadi setiap kali saya memberi kelas ini ISO-8601 kelas ini akan mengembalikan objek datetime dari string...

Contoh Python 3.7:

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

Ini bekerja dengan sangat baik, tetapi ketika saya menggunakannya pada Python 3.6 atau 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'

Aneh sekali. Apa penyebab masalahnya? Bagaimana cara memperbaikinya?


person DarkSuniuM    schedule 14.11.2018    source sumber
comment
Yang Anda katakan adalah Python 3.6 menggunakan modul dari Python 3.5. Itu sebuah masalah.   -  person user2357112 supports Monica    schedule 14.11.2018
comment
@ user2357112 Saya tidak menginstal Python 3.6 di desktop saya, tetapi diinstal di server, Jadi saya menggunakan python3.5 saya, tetapi saya juga memeriksanya di server dengan python3.6 dan mengalami masalah yang sama   -  person DarkSuniuM    schedule 14.11.2018
comment
@ user2357112 Ditambahkan Python 3.6 Traceback juga   -  person DarkSuniuM    schedule 14.11.2018


Jawaban (1)


Oke, setelah 2 hari, saya memeriksa log perubahan Python 3.7, dan saya menemukannya dukungan untuk Z sebagai offset UTC telah ditambahkan di Python 3.7. Lihat masalah ini di pelacak masalah Python, yang utamanya membahas tentang menambahkan dukungan untuk titik dua, namun juga menyebutkan Z dukungan lebih jauh ke bawah halaman. Lihat juga datetime dokumen, yang menyatakan

Diubah di versi 3.7: Ketika direktif %z diberikan ke metode strptime(), offset UTC dapat memiliki titik dua sebagai pemisah antara jam, menit, dan detik. Misalnya, '+01:00:00' akan diuraikan sebagai offset satu jam. Selain itu, memberikan 'Z' identik dengan '+00:00'.

Di kelas saya, saya harus mengubah format waktu menjadi ini:

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

Saya mengubah %z di akhir menjadi Z, mengkodekan offset dengan keras.

person DarkSuniuM    schedule 14.11.2018