time.LoadLocation în Go

Obține un fus orar: LoadLocation după nume („Europe/Bucharest”), din date brute (FromTZData) sau cu decalaj fix (FixedZone).

Sintaxă
func LoadLocation(name string) (*Location, error)
func LoadLocationFromTZData(name string, data []byte) (*Location, error)   // Go 1.10
func FixedZone(name string, offset int) *Location

Ce face time.LoadLocation

time.LoadLocation("Europe/Bucharest") încarcă fusul orar cu acel nume din baza de date IANA a sistemului de operare. Un fus încărcat așa știe toate regulile: ora de vară (EEST, UTC+3) și de iarnă (EET, UTC+2) și schimbările istorice. Numele speciale "UTC" și "Local" returnează time.UTC și time.Local. Pe sisteme fără baza de fusuri (containere minimale, Windows fără Go instalat), adaugă import _ "time/tzdata", care include baza în program (aproximativ 450 KB).

time.LoadLocationFromTZData(nume, date) creează fusul din conținutul unui fișier în formatul IANA (de exemplu /usr/share/zoneinfo/Europe/Bucharest sau /etc/localtime), când ai datele din altă sursă.

time.FixedZone("EEST", 3*3600) creează o zonă cu decalaj fix față de UTC, în secunde, fără ore de vară. E potrivită când primești un decalaj explicit (de exemplu +03:00 dintr-un API), dar nu pentru a reprezenta România tot anul.

Parametri

Parametru Descriere
name Numele IANA al zonei ("Europe/Bucharest", "America/New_York") sau numele afișat al zonei fixe.
data Conținutul unui fișier de fus orar IANA (doar la FromTZData).
offset Decalajul față de UTC, în secunde (doar la FixedZone).

Ce returnează

Un *time.Location; LoadLocation și LoadLocationFromTZData returnează și o eroare.

Exemple

Exemplul 1: Ora de vară și de iarnă la București

În 2026, România trece la ora de iarnă pe 25 octombrie, la 04:00.

package main

import (
	"fmt"
	"time"
)

func main() {
	buc, err := time.LoadLocation("Europe/Bucharest")
	if err != nil {
		fmt.Println("eroare:", err)
		return
	}
	for _, zi := range []int{24, 25, 26} {
		t := time.Date(2026, time.October, zi, 12, 0, 0, 0, buc)
		nume, decalaj := t.Zone()
		fmt.Printf("%s %s UTC%+d\n", t.Format("02.01.2006 15:04"), nume, decalaj/3600)
	}

	_, err = time.LoadLocation("Europe/Iasi")
	fmt.Println("Zonă inexistentă:", err)
	utc, _ := time.LoadLocation("UTC")
	fmt.Println("UTC este time.UTC:", utc == time.UTC)
}

Rezultat

24.10.2026 12:00 EEST UTC+3
25.10.2026 12:00 EET UTC+2
26.10.2026 12:00 EET UTC+2
Zonă inexistentă: unknown time zone Europe/Iasi
UTC este time.UTC: true

Exemplul 2: FixedZone: decalaj fix, fără oră de vară

O zonă fixă „EET” dă ora corectă iarna, dar greșită vara; zona încărcată cu LoadLocation le dă corect pe amândouă.

package main

import (
	"fmt"
	"time"
)

func main() {
	fix := time.FixedZone("EET", 2*3600)
	buc, err := time.LoadLocation("Europe/Bucharest")
	if err != nil {
		fmt.Println(err)
		return
	}
	for _, t := range []time.Time{
		time.Date(2026, time.January, 15, 10, 0, 0, 0, time.UTC),
		time.Date(2026, time.July, 15, 10, 0, 0, 0, time.UTC),
	} {
		fmt.Printf("%s UTC -> fixă: %s | București: %s\n",
			t.Format("02.01 15:04"), t.In(fix).Format("15:04 MST"), t.In(buc).Format("15:04 MST"))
	}

	dinAPI := time.FixedZone("", -5*3600) // „-05:00” primit de la un API
	fmt.Println(time.Date(2026, 10, 19, 8, 0, 0, 0, dinAPI))
}

Rezultat

15.01 10:00 UTC -> fixă: 12:00 EET | București: 12:00 EET
15.07 10:00 UTC -> fixă: 12:00 EET | București: 13:00 EEST
2026-10-19 08:00:00 -0500 -0500

Exemplul 3: Fus orar din datele unui fișier IANA

Citim fișierul de fus orar al sistemului (calea obișnuită pe Linux și macOS) și creăm zona din conținutul lui.

package main

import (
	"fmt"
	"os"
	"time"
)

func main() {
	date, err := os.ReadFile("/usr/share/zoneinfo/Europe/Bucharest")
	if err != nil {
		fmt.Println("fișierul nu există pe acest sistem:", err)
		return
	}
	loc, err := time.LoadLocationFromTZData("Europe/Bucharest", date)
	if err != nil {
		fmt.Println(err)
		return
	}
	t := time.Date(2026, 10, 19, 9, 0, 0, 0, time.UTC)
	fmt.Println(loc, "->", t.In(loc).Format("15:04 MST"))

	_, err = time.LoadLocationFromTZData("gresit", []byte("nu sunt date de fus orar"))
	fmt.Println("Date invalide:", err)
}

Rezultat

Europe/Bucharest -> 12:00 EEST
Date invalide: malformed time zone information

Greșeli frecvente

  • Ignori eroarea de la LoadLocation: pe un server fără baza de fusuri primești nil, iar t.In(nil) se oprește cu panică. Verifică eroarea sau importă time/tzdata.
  • Folosești FixedZone("EET", 2*3600) pentru România: vara orele sunt greșite cu o oră.
  • Încarci zona la fiecare cerere: LoadLocation citește fișiere de pe disc. Încarc-o o dată, la pornire.

Comenzi înrudite

  • time.Time.In: Afișează același moment în alt fus orar: In(loc) pentru o zonă anume, UTC() pentru UTC, Local() pentru zona calculatorului.
  • time.Date: Construiește un moment din an, lună, zi, oră, minut, secundă, nanosecundă și fus orar; normalizează valorile prea mari.
  • time.Parse: Citește o dată din text după un model (2006-01-02 15:04); ParseInLocation o interpretează într-un fus orar dat.
  • time.Time: Tipul care ține un moment în timp: dată, oră, nanosecunde și fusul orar. Se creează cu time.Date sau time.Now.