Fungsi isoformat modul datetime di python mengembalikan offset yang salah

Oct 07 2020

Jadi saya punya -

timezone = pytz.timezone('Asia/Kolkata')
one_time_stamp = '2017-06-01 05:30:00'

zoned_time_stamp = datetime.datetime.strptime(one_time_stamp, '%Y-%m-%d %H:%M:%S')

#This outputs 2017-06-01 05:30:00 which is fine.
print(zoned_time_stamp)

#notice timezone added
non_iso_zoned_ts = zoned_time_stamp.replace(microsecond=0, tzinfo=timezone)
# This outputs 2017-06-01 05:30:00 which is fine.
print(zoned_time_stamp)

iso_date = non_iso_zoned_ts.isoformat()
#This outputs 2017-06-01T05:30:00+05:53 which is incorrect. Ideally it should be 2017-06-01T05:30:00+05:30
print(iso_date)

Sekarang saya bertanya-tanya mengapa isoformat menambahkan offset 05:53 sedangkan zona waktu Asia / Kolkata adalah +05: 30. ref -https://www.zeitverschiebung.net/en/timezone/asia--kolkata

Jawaban

2 wim Oct 07 2020 at 11:42

Hampir selalu salah jika hanya menggunakan instance pytz untuk tzinfo saat membuat datetime. Cara yang benar untuk mengonversi datetime naif menjadi instance sadar zona waktu menggunakan pytz adalah dengan metode pelokalan zona:

zone.localize(dt)

Keluaran untuk kasus Anda:

>>> print(timezone.localize(zoned_time_stamp))
2017-06-01 05:30:00+05:30

Cukup jelas didokumentasikan bahwa meneruskan instance pytz di tzinfo bukanlah cara yang didukung untuk membuat datetime yang dilokalkan. Namun, itu juga kesalahan yang umum terlihat pada kode Python - tebak banyak pengguna tidak membaca dokumennya!

Untuk memahami mengapa pendekatan yang salah menunjukkan apa yang dilakukannya ( +05:53offset aneh ), lihat pytz: The Fastest Footgun in the West oleh Paul Ganssle.