time.Time în Go

Tipul care ține un moment în timp: dată, oră, nanosecunde și fusul orar. Se creează cu time.Date sau time.Now.

Sintaxă
import "time"

var t time.Time                       // valoarea zero
t := time.Date(an, luna, zi, ora, min, sec, nsec, loc)
t := time.Now()
func (t Time) IsZero() bool

Ce face time.Time

time.Time reprezintă un moment precis: anul, luna, ziua, ora, minutul, secunda, nanosecunda și fusul orar (*time.Location). Este o valoare obișnuită (nu un pointer): o poți copia, o poți transmite funcțiilor și o poți pune în structuri fără grijă.

Un moment fix se creează cu time.Date(2026, time.October, 19, 14, 30, 0, 0, time.UTC), iar momentul curent cu time.Now(). Dacă dai valori în afara intervalului (de exemplu 32 octombrie), time.Date le normalizează: 32 octombrie devine 1 noiembrie.

Valoarea zero a tipului (var t time.Time) este 1 ianuarie anul 1, ora 00:00:00 UTC. t.IsZero() spune dacă un câmp de tip time.Time a rămas necompletat, de exemplu data ultimei autentificări a unui utilizator nou.

Parametri

Parametru Descriere
an, luna, zi Data. Luna are tipul time.Month: time.October sau time.Month(10).
ora, min, sec, nsec Ora, minutul, secunda și nanosecundele.
loc Fusul orar: time.UTC, time.Local sau unul încărcat cu time.LoadLocation. Nu poate fi nil.

Ce returnează

time.Date și time.Now returnează un time.Time. IsZero returnează true dacă momentul este valoarea zero.

Exemple

Exemplul 1: Un moment fix creat cu time.Date

fmt.Println afișează momentul în formatul implicit, cu fusul orar la final. Câmpurile se citesc cu metode (Year, Month, Day…).

package main

import (
	"fmt"
	"time"
)

func main() {
	examen := time.Date(2026, time.October, 19, 14, 30, 0, 0, time.UTC)
	fmt.Println("Examenul:", examen)
	fmt.Println("Anul:", examen.Year(), "luna:", examen.Month(), "ziua:", examen.Day())

	// Valorile prea mari sunt normalizate: 32 octombrie = 1 noiembrie
	t := time.Date(2026, time.October, 32, 0, 0, 0, 0, time.UTC)
	fmt.Println("32 octombrie devine:", t.Format("2006-01-02"))
}

Rezultat

Examenul: 2026-10-19 14:30:00 +0000 UTC
Anul: 2026 luna: October ziua: 19
32 octombrie devine: 2026-11-01

Exemplul 2: Câmp necompletat: IsZero

Un câmp time.Time dintr-o structură pornește cu valoarea zero. IsZero este modul corect de a verifica dacă a fost setat.

package main

import (
	"fmt"
	"time"
)

type Utilizator struct {
	Nume          string
	UltimaLogare  time.Time
}

func main() {
	utilizatori := []Utilizator{
		{Nume: "Ana", UltimaLogare: time.Date(2026, 10, 18, 9, 15, 0, 0, time.UTC)},
		{Nume: "Mihai"}, // nu s-a logat niciodată
	}
	for _, u := range utilizatori {
		if u.UltimaLogare.IsZero() {
			fmt.Printf("%s: nu s-a logat încă\n", u.Nume)
		} else {
			fmt.Printf("%s: ultima logare %s\n", u.Nume, u.UltimaLogare.Format("02.01.2006 15:04"))
		}
	}
	var zero time.Time
	fmt.Println("Valoarea zero:", zero)
}

Rezultat

Ana: ultima logare 18.10.2026 09:15
Mihai: nu s-a logat încă
Valoarea zero: 0001-01-01 00:00:00 +0000 UTC

Exemplul 3: Momentul curent cu time.Now

time.Now() dă ora calculatorului, deci rezultatul diferă la fiecare rulare.

package main

import (
	"fmt"
	"time"
)

func main() {
	acum := time.Now()
	fmt.Println("Acum:", acum.Format("02.01.2006 15:04:05"))
	fmt.Println("Anul curent:", acum.Year())
}

Rezultat posibil (diferă la fiecare rulare)

Acum: 19.10.2026 11:42:07
Anul curent: 2026

Greșeli frecvente

  • Compari momente cu ==. Două valori time.Time pentru același moment pot avea fusuri orare diferite și == spune că sunt diferite. Folosește t.Equal(u).
  • Verifici o dată necompletată cu t == time.Time{}. Funcționează de obicei, dar t.IsZero() este mai clar și merge și după conversii de fus orar.
  • Dai nil ca fus orar lui time.Date: programul se oprește cu panică. Folosește time.UTC sau time.Local.

Comenzi înrudite

  • time.Date: Construiește un moment din an, lună, zi, oră, minut, secundă, nanosecundă și fus orar; normalizează valorile prea mari.
  • time.Now: Returnează momentul curent, în fusul orar local, cu o citire a ceasului monoton pentru măsurarea duratelor.
  • time.Time.Format: Transformă un moment în text după un model scris cu data de referință 2 ianuarie 2006, 15:04:05.
  • 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.Add: Returnează momentul mutat înainte (sau înapoi, cu durată negativă) cu o durată exactă: ore, minute, secunde.
  • time.Time.Sub: Calculează cât timp a trecut între două momente și returnează diferența ca time.Duration.
  • time.Time.Before: Before, After și Equal compară două momente: este t înainte, după sau exact în același moment cu u?
  • 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.Duration: Tipul pentru o durată, păstrată în nanosecunde; se scrie ca 90*time.Minute și se afișează ca „1h30m0s”.