time.Time.Unix în Go

Transformă momentul în număr de secunde (Unix) sau milisecunde (UnixMilli) trecute de la 1 ianuarie 1970 UTC.

Sintaxă
func (t Time) Unix() int64
func (t Time) UnixMilli() int64      // Go 1.17

func Unix(sec int64, nsec int64) Time
func UnixMilli(msec int64) Time       // Go 1.17
func UnixMicro(usec int64) Time       // Go 1.17

Ce face time.Time.Unix

Timpul Unix (timestamp) este numărul de secunde de la 1 ianuarie 1970, 00:00:00 UTC. Nu depinde de fusul orar, deci este ușor de salvat în baze de date sau de trimis între programe. t.Unix() dă secundele, iar t.UnixMilli() dă milisecundele (formatul folosit de JavaScript cu Date.now()). Există și UnixMicro și UnixNano.

Drumul invers îl fac funcțiile pachetului: time.Unix(sec, nsec) (secunde plus nanosecunde, de obicei 0), time.UnixMilli(ms) și time.UnixMicro(µs), pentru timestamp-uri în milisecunde (JavaScript, multe API-uri) sau microsecunde (unele baze de date și jurnale). Rezultatul lor este în fusul orar local; adaugă .UTC() pentru o afișare stabilă.

Ce returnează

Un int64: secunde (Unix) sau milisecunde (UnixMilli).

Exemple

Exemplul 1: Moment în secunde și milisecunde

package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.Date(2026, time.October, 19, 12, 0, 0, 0, time.UTC)
	fmt.Println("Unix:     ", t.Unix())
	fmt.Println("UnixMilli:", t.UnixMilli())

	// Același moment scris în alt fus orar are același timestamp
	ro := time.FixedZone("EEST", 3*3600)
	fmt.Println("În EEST:  ", t.In(ro).Unix())

	fmt.Println("Epoca Unix:", time.Unix(0, 0).UTC())
}

Rezultat

Unix:      1792411200
UnixMilli: 1792411200000
În EEST:   1792411200
Epoca Unix: 1970-01-01 00:00:00 +0000 UTC

Exemplul 2: Din timestamp înapoi în dată

Un API trimite momentul în milisecunde (ca JavaScript); îl transformăm în time.Time.

package main

import (
	"fmt"
	"time"
)

func main() {
	var dinAPI int64 = 1792411200000 // milisecunde
	t := time.UnixMilli(dinAPI).UTC()
	fmt.Println("Comanda plasată:", t.Format(time.DateTime), "UTC")

	expira := time.Unix(1792497600, 0).UTC()
	fmt.Println("Tokenul expiră: ", expira.Format(time.DateTime), "UTC")

	dinJurnal := time.UnixMicro(1792411200123456).UTC()
	fmt.Println("Intrare jurnal: ", dinJurnal.Format("15:04:05.000000"))
	fmt.Println("Valabil:        ", expira.Sub(t))
}

Rezultat

Comanda plasată: 2026-10-19 12:00:00 UTC
Tokenul expiră:  2026-10-20 12:00:00 UTC
Intrare jurnal:  12:00:00.123456
Valabil:         24h0m0s

Greșeli frecvente

  • Dai milisecunde lui time.Unix (sau secunde lui time.UnixMilli). Data iese în anul 58000 sau în 1970; verifică unitatea primită.
  • Afișezi rezultatul lui time.Unix și te miri că ora diferă de la un server la altul: este în fusul local. Folosește .UTC() sau .In(loc).

Comenzi înrudite

  • 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.In: Afișează același moment în alt fus orar: In(loc) pentru o zonă anume, UTC() pentru UTC, Local() pentru zona calculatorului.
  • time.Time.Format: Transformă un moment în text după un model scris cu data de referință 2 ianuarie 2006, 15:04:05.