Ce face time.Time.In
Un time.Time ține momentul și fusul orar în care este afișat. t.In(loc) returnează același moment, dar cu altă zonă, deci Hour(), Day() și Format dau valorile din zona nouă. t.UTC() este scurtătura pentru t.In(time.UTC), iar t.Local() pentru t.In(time.Local), adică zona setată pe calculatorul sau serverul pe care rulează programul.
Zonele cu nume se încarcă cu time.LoadLocation("Europe/Bucharest"); ele știu și de ora de vară (EEST, UTC+3) și de iarnă (EET, UTC+2). Baza de date a fusurilor vine de la sistemul de operare; pe sisteme fără ea (containere minimale) adaugă import _ "time/tzdata".
Regula practică: salvează și compară momentele în UTC, convertește în zona utilizatorului doar la afișare.
Parametri
| Parametru | Descriere |
|---|---|
loc |
Fusul orar țintă (*time.Location). Dacă este nil, In se oprește cu panică. |
Ce returnează
Un time.Time cu același moment, afișat în zona cerută.
Exemple
Exemplul 1: Ora unui meci în mai multe orașe
Pe 19 octombrie 2026 România are încă ora de vară (EEST, +03:00).
package main
import (
"fmt"
"time"
)
func main() {
meci := time.Date(2026, time.October, 19, 18, 45, 0, 0, time.UTC)
for _, zona := range []string{"Europe/Bucharest", "Europe/London", "America/New_York", "Asia/Tokyo"} {
loc, err := time.LoadLocation(zona)
if err != nil {
fmt.Println("eroare:", err)
continue
}
fmt.Printf("%-17s %s\n", zona, meci.In(loc).Format("02.01 15:04 MST (-07:00)"))
}
}
Rezultat
Europe/Bucharest 19.10 21:45 EEST (+03:00)
Europe/London 19.10 19:45 BST (+01:00)
America/New_York 19.10 14:45 EDT (-04:00)
Asia/Tokyo 20.10 03:45 JST (+09:00)
Exemplul 2: Ora de vară și de iarnă, apoi înapoi în UTC
package main
import (
"fmt"
"time"
)
func main() {
buc, err := time.LoadLocation("Europe/Bucharest")
if err != nil {
fmt.Println(err)
return
}
vara := time.Date(2026, time.July, 1, 12, 0, 0, 0, buc)
iarna := time.Date(2026, time.December, 1, 12, 0, 0, 0, buc)
fmt.Println("Vara: ", vara, "->", vara.UTC())
fmt.Println("Iarna:", iarna, "->", iarna.UTC())
fmt.Println("Același moment:", vara.Equal(vara.UTC()))
}
Rezultat
Vara: 2026-07-01 12:00:00 +0300 EEST -> 2026-07-01 09:00:00 +0000 UTC
Iarna: 2026-12-01 12:00:00 +0200 EET -> 2026-12-01 10:00:00 +0000 UTC
Același moment: true
Exemplul 3: Local(): zona calculatorului
Rezultatul depinde de fusul orar setat pe calculatorul care rulează programul (aici, unul din România).
package main
import (
"fmt"
"time"
)
func main() {
t := time.Date(2026, time.October, 19, 9, 0, 0, 0, time.UTC)
fmt.Println("UTC: ", t)
fmt.Println("Local:", t.Local())
fmt.Println("Zona locală:", time.Local)
}
Rezultat posibil (diferă la fiecare rulare)
UTC: 2026-10-19 09:00:00 +0000 UTC
Local: 2026-10-19 12:00:00 +0300 EEST
Zona locală: Local
Greșeli frecvente
- Ignori eroarea de la
LoadLocation. Pe un server fără baza de fusuri orare,locestenilșit.In(loc)se oprește cu panică. - Folosești
time.FixedZone("EET", 2*3600)pentru România tot anul. O zonă fixă nu știe de ora de vară; foloseșteLoadLocation("Europe/Bucharest"). - Te bazezi pe
Local()pe server: serverele rulează de obicei în UTC, deci afișarea nu va fi ora României.
Comenzi înrudite
time.LoadLocation: Obține un fus orar: LoadLocation după nume („Europe/Bucharest”), din date brute (FromTZData) sau cu decalaj fix (FixedZone).time.Time.Format: Transformă un moment în text după un model scris cu data de referință 2 ianuarie 2006, 15:04:05.time.Time: Tipul care ține un moment în timp: dată, oră, nanosecunde și fusul orar. Se creează cu time.Date sau time.Now.time.Time.Unix: Transformă momentul în număr de secunde (Unix) sau milisecunde (UnixMilli) trecute de la 1 ianuarie 1970 UTC.time.Time.Before: Before, After și Equal compară două momente: este t înainte, după sau exact în același moment cu u?