time.Time.In în Go

Afișează același moment în alt fus orar: In(loc) pentru o zonă anume, UTC() pentru UTC, Local() pentru zona calculatorului.

Sintaxă
func (t Time) In(loc *Location) Time
func (t Time) UTC() Time
func (t Time) Local() Time

func LoadLocation(name string) (*Location, error)

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, loc este nil și t.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ște LoadLocation("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?