tzdata
fusos horários nomeados (IANA)
use tzdataA base IANA tzdata que pluga no
time.Zonedo core. Otimesegue comUtc/Local/Offset(mecanismo, tier 0); isto é a camada de nomes ("America/Sao_Paulo") por cima: dado mutável (a base muda com a política dos países), carregado sob demanda, com peso só pra quem importa. Tier 1; é o exemplo canônico do corte mecanismo-vs-dado (§1).
fn named(name: string) -> Result[Zone, error{UnknownZone}] // "America/Sao_Paulo" → time.Zonefn (z: Zone) offset_at(t: DateTime) -> i32 // offset (min) NAQUELE instante (resolve DST)fn (z: Zone) abbreviation_at(t: DateTime) -> string // "-03" / "BRST"fn (t: DateTime) in_zone(name: string) -> Result[DateTime, error{UnknownZone}] // converte p/ o fuso nomeadofn list_zones() -> Iterator[string] // todos os nomes disponíveisfn version() -> string // versão da base tzdata embarcada ("2026a")use tzdata
sp := tzdata.named("America/Sao_Paulo") catch |e| { return e }agora_sp := time.now_utc().to_zone(sp) // usa o time.Zone resolvido pela baseCuradoria
Seção intitulada “Curadoria”- Pluga no
time.Zoneexistente: não é um relógio paralelo; é a resolução de nome para offset (com DST). Otimecore não muda. - Carregada sob demanda: a base é grande e gira (releases tzdata anuais); só entra no binário de quem
faz
use tzdata. O caso comum (UTC/offset) nunca paga. - Offset é resolvido no instante (
offset_at) porque DST faz o offset de um fuso variar no tempo: não há “o offset de São Paulo”, há o offset numa data.