Portál AbcLinuxu, 9. května 2025 19:28
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'
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?
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.