Portál AbcLinuxu, 9. května 2025 19:28

Dotaz: Konverze data mezi timezones v Pythonu

12.7.2010 02:30 Jary | skóre: 30 | blog: Jary má blog | Dům
Konverze data mezi timezones v Pythonu
Přečteno: 229×
Odpovědět | Admin

Nazdar. Mám datum v UTC v datetime a chci jej konvertovat do jiného timezone. Způsob detekce lokálního timezone jsem hledal dost dlouho. Našel jsem pouze to, že jméno lokálního timezone je v time.tzname a to se dá použít k vytvoření timezone objektu a ten pak použít pro konverzi. Našel jsem tento způsob:

In [69]: dtn=datetime.datetime.now(tz=pytz.UTC)

In [70]: dtn
Out[70]: datetime.datetime(2010, 7, 12, 0, 13, 17, 236937, tzinfo=<UTC>)

In [71]: dtn.astimezone(pytz.timezone(time.tzname[0]))
Out[71]: datetime.datetime(2010, 7, 12, 2, 13, 17, 236937, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>)
Je to OK? Práce s daty je v Pythonu utrpení. Řekl bych, že tenhle kód by měl bezpečně zjistit lokální TZ a konvertovat to. Ani s přestupným rokem by nemusel být problém, ale tady jsem trochu na vážkách, jestli dělám správně, že používám první prvek z tuplu tzname. Ten by měl vracet timezone bez dayligt saving time. pytz.timezone("CET") funguje, pytz.timezone("CEST") způsobí: UnknownTimeZoneError: 'CEST'
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky. GitHub
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

12.7.2010 12:35 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Konverze data mezi timezones v Pythonu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Práce s daty je utrpení, protože samotná data a časové zóny jsou utrpení. Nemnoho jazyků datumy řeší nějak více (pokud se bavíme o jazycích a jejich standardních knihovnách).

Samozřejmě nejlepší, co můžeš udělat, je přečíst si dokumentaci k pytz.

Ten příklad, cos uvedl, je myslím dobře (za předpokladu, že v time.tzname bude vždy správný údaj). Sám vidíš, že se to do CEST převedlo správně. Stojí za povšimnutí, že nastavení tz přímo v konstruktoru datetime funguje správně jen u časových zón bez DST (takže zrovna u UTC to naštěstí funguje); jinak je doporučeno používat metodu localize. V případě problémů lze použít ještě metodu normalize (pro převod do DST a zpět). (Obojí jsou metody objektu časové zóny. Píšu to sem proto, aby si nějaký jiný náhodný čtenář nemyslel, že je to tak jednoduché.)

Proč by měl být problém zrovna přestupný rok? :-)

Obecně asi nejlepší způsob je používat všude UTC a do jiných zón převádět jen při výpisu uživateli; bylo by fajn, kdyby stejně jako se ujalo UTF-8, se ujalo i UTC :-)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.