python'daki datetime modülünün isoformat işlevi yanlış ofset döndürüyor

Oct 07 2020

Yani bende -

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)

Şimdi, Asya / Kalküta saat dilimi +05: 30 iken izoformatın neden 05:53'lük bir fark eklediğini merak ediyorum. ref -https://www.zeitverschiebung.net/en/timezone/asia--kolkata

Yanıtlar

2 wim Oct 07 2020 at 11:42

Bir datetime oluştururken tzinfo için sadece bir pytz örneğini yakalamak neredeyse her zaman yanlıştır. Pytz kullanarak naif bir tarih saatini saat dilimine duyarlı bir örneğe dönüştürmenin doğru yolu, bölgenin yerelleştirme yöntemidir:

zone.localize(dt)

Vakanız için çıktı:

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

Oldukça oluyor açıkça belgelenmiş tzinfo bir pytz örneğini geçen bir lokalize datetime oluşturmanın desteklenen bir yol olmadığını. Bununla birlikte, bu aynı zamanda Python kodunda çok sık görülen bir hatadır - sanırım birçok kullanıcı belgeleri okumaz!

Yanlış yaklaşımın neden yaptığını gösterdiğini anlamak için (garip +05:53ofset), Paul Ganssle'ın yazdığı pytz: Batı'daki En Hızlı Tabanca'ya bakın.