Fusuri orare: timezone, astimezone() și ZoneInfo în Python

Dată și oră Python 3.2+ (zoneinfo: 3.9+, datetime.UTC: 3.11+)

Lucrul cu fusuri orare: date „conștiente” de fus, conversii și ora de vară.

Sintaxă
from datetime import timezone, timedelta
timezone(timedelta(hours=2), name=None)
dt.astimezone(tz)
dt.utcoffset(), dt.tzname(), dt.dst()

Ce face Fusuri orare: timezone, astimezone() și ZoneInfo

timezone(timedelta(hours=2)) creează un fus cu decalaj fix față de UTC; timezone.utc (sau datetime.UTC) este UTC. Pentru fusuri reale, cu ora de vară, folosește zoneinfo.ZoneInfo("Europe/Bucharest"). tzinfo este clasa de bază abstractă a tuturor fusurilor.

astimezone(tz) convertește același moment în alt fus. utcoffset() dă decalajul față de UTC, tzname() numele fusului (de exemplu EEST), iar dst() cât din decalaj se datorează orei de vară. Metodele există pe datetime, time și pe obiectele timezone; timezone.fromutc() este folosită intern de astimezone.

Parametri

Parametru Descriere
offset Decalajul față de UTC, ca timedelta.
name Opțional. Numele afișat al fusului.
tz Pentru astimezone: fusul țintă.

Ce returnează

astimezone: un datetime nou. utcoffset/dst: timedelta. tzname: text.

Exemple

Exemplul 1: Conversii între fusuri

from datetime import datetime, timezone
from zoneinfo import ZoneInfo
bucuresti = ZoneInfo("Europe/Bucharest")
sedinta = datetime(2026, 10, 19, 15, 0, tzinfo=bucuresti)
print(sedinta, sedinta.tzname(), sedinta.utcoffset(), sedinta.dst())
print(sedinta.astimezone(timezone.utc))
print(sedinta.astimezone(ZoneInfo("America/New_York")))
iarna = datetime(2026, 12, 19, 15, 0, tzinfo=bucuresti)
print(iarna.tzname(), iarna.utcoffset(), iarna.dst())

Rezultat

2026-10-19 15:00:00+03:00 EEST 3:00:00 1:00:00
2026-10-19 12:00:00+00:00
2026-10-19 08:00:00-04:00
EET 2:00:00 0:00:00

Exemplul 2: Fus cu decalaj fix

from datetime import datetime, timezone, timedelta, time, tzinfo
plus2 = timezone(timedelta(hours=2), "EET fix")
print(plus2.utcoffset(None), plus2.tzname(None), plus2.dst(None))
d = datetime(2026, 1, 10, 12, 0, tzinfo=timezone.utc)
print(plus2.fromutc(d.replace(tzinfo=plus2)))
print(d.astimezone(plus2))
t = time(9, 30, tzinfo=plus2)
print(t.utcoffset(), t.tzname(), t.dst(), isinstance(plus2, tzinfo))

Rezultat

2:00:00 EET fix None
2026-01-10 14:00:00+02:00
2026-01-10 14:00:00+02:00
2:00:00 EET fix None True

Greșeli frecvente

  • Construiești un fus cu timezone(timedelta(hours=2)) pentru România și uiți ora de vară (+3 vara). Folosește ZoneInfo("Europe/Bucharest").
  • Pui fusul pe o dată cu replace(tzinfo=...) crezând că o convertești. replace doar etichetează aceeași oră; conversia se face cu astimezone.

Comenzi înrudite

  • datetime.datetime: Clasa pentru o dată împreună cu ora: creare, data și ora curentă, calcule și comparații.
  • timestamp() și fromtimestamp(): Conversia între date și timestamp-uri Unix (secunde de la 1 ianuarie 1970 UTC).
  • time.tzset(): Reîncarcă setările de fus orar după variabila de mediu TZ.