time.Date în Go

Construiește un moment din an, lună, zi, oră, minut, secundă, nanosecundă și fus orar; normalizează valorile prea mari.

Sintaxă
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time

Ce face time.Date

time.Date(2026, time.October, 19, 14, 30, 0, 0, time.UTC) creează momentul 19 octombrie 2026, ora 14:30:00, în UTC. Toți cei opt parametri sunt obligatorii: dacă nu ai nevoie de oră, scrii 0, 0, 0, 0. Luna are tipul time.Month: scrii time.October sau o constantă 10; o variabilă int se convertește cu time.Month(luna).

Valorile din afara intervalului sunt normalizate, nu dau eroare: 32 octombrie devine 1 noiembrie, ora 25 devine ora 1 a zilei următoare, iar ziua 0 este ultima zi a lunii anterioare. Asta e util pentru calcule („ultima zi a lunii”), dar înseamnă și că o dată greșită (31 februarie) nu este refuzată; pentru validarea textului introdus de utilizator folosește time.Parse.

Ultimul parametru, fusul orar, nu poate fi nil. Cu time.UTC rezultatul este același pe orice calculator; cu time.Local depinde de calculator; pentru o zonă anume folosești time.LoadLocation.

Parametri

Parametru Descriere
year, month, day Data. month are tipul time.Month.
hour, min, sec, nsec Ora, minutul, secunda și nanosecunda.
loc Fusul orar: time.UTC, time.Local sau unul din time.LoadLocation.

Ce returnează

Momentul construit (time.Time).

Exemple

Exemplul 1: Date fixe pentru un calendar

package main

import (
	"fmt"
	"time"
)

func main() {
	examen := time.Date(2026, time.June, 24, 9, 0, 0, 0, time.UTC)
	revelion := time.Date(2026, 12, 31, 23, 59, 59, 0, time.UTC)
	luna := 3
	primavara := time.Date(2027, time.Month(luna), 1, 0, 0, 0, 0, time.UTC)

	fmt.Println("Examen:   ", examen.Format("Monday, 02.01.2006 15:04"))
	fmt.Println("Revelion: ", revelion)
	fmt.Println("Primăvara:", primavara.Format("02.01.2006"))
	fmt.Println("Zile până la revelion:", int(revelion.Sub(examen).Hours()/24))
}

Rezultat

Examen:    Wednesday, 24.06.2026 09:00
Revelion:  2026-12-31 23:59:59 +0000 UTC
Primăvara: 01.03.2027
Zile până la revelion: 190

Exemplul 2: Normalizarea valorilor

package main

import (
	"fmt"
	"time"
)

func main() {
	f := "02.01.2006 15:04"
	fmt.Println("32 octombrie:  ", time.Date(2026, 10, 32, 0, 0, 0, 0, time.UTC).Format(f))
	fmt.Println("ora 25:        ", time.Date(2026, 10, 19, 25, 0, 0, 0, time.UTC).Format(f))
	fmt.Println("minutul 90:    ", time.Date(2026, 10, 19, 10, 90, 0, 0, time.UTC).Format(f))
	fmt.Println("ziua 0 a lunii:", time.Date(2026, 3, 0, 0, 0, 0, 0, time.UTC).Format(f))
	fmt.Println("31 februarie:  ", time.Date(2026, 2, 31, 0, 0, 0, 0, time.UTC).Format(f))
	fmt.Println("luna 13:       ", time.Date(2026, 13, 1, 0, 0, 0, 0, time.UTC).Format(f))
}

Rezultat

32 octombrie:   01.11.2026 00:00
ora 25:         20.10.2026 01:00
minutul 90:     19.10.2026 11:30
ziua 0 a lunii: 28.02.2026 00:00
31 februarie:   03.03.2026 00:00
luna 13:        01.01.2027 00:00

Exemplul 3: Aceeași oră în fusuri diferite

Ora 12:00 la București și ora 12:00 în UTC sunt momente diferite.

package main

import (
	"fmt"
	"time"
)

func main() {
	buc, err := time.LoadLocation("Europe/Bucharest")
	if err != nil {
		fmt.Println(err)
		return
	}
	a := time.Date(2026, 10, 19, 12, 0, 0, 0, buc)
	b := time.Date(2026, 10, 19, 12, 0, 0, 0, time.UTC)
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println("Diferența:", b.Sub(a))
}

Rezultat

2026-10-19 12:00:00 +0300 EEST
2026-10-19 12:00:00 +0000 UTC
Diferența: 3h0m0s

Greșeli frecvente

  • Dai lunile începând de la 0 (ca în JavaScript): time.Date(2026, 0, 1, ...) este 1 decembrie 2025. În Go ianuarie este 1.
  • Folosești time.Date ca să verifici dacă o dată introdusă există: 31.02 nu dă eroare, devine 3 martie. Validează cu time.Parse.
  • Dai nil ca fus orar: programul se oprește cu panică.

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.Now: Returnează momentul curent, în fusul orar local, cu o citire a ceasului monoton pentru măsurarea duratelor.
  • 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.LoadLocation: Obține un fus orar: LoadLocation după nume („Europe/Bucharest”), din date brute (FromTZData) sau cu decalaj fix (FixedZone).
  • time.Time.Date: Citește data dintr-un moment: Date dă anul, luna și ziua deodată; Year, Month și Day le dau pe rând.
  • time.Month: Tipul pentru lunile anului, de la time.January (1) la time.December (12); String() dă numele englezesc.