time.Time.Date în Go

Citește data dintr-un moment: Date dă anul, luna și ziua deodată; Year, Month și Day le dau pe rând.

Sintaxă
func (t Time) Date() (year int, month Month, day int)
func (t Time) Year() int
func (t Time) Month() Month
func (t Time) Day() int

Ce face time.Time.Date

t.Date() returnează trei valori: anul, luna (de tip time.Month) și ziua din lună. Este mai eficientă decât trei apeluri separate când ai nevoie de toate.

Year(), Month() și Day() returnează câte o singură componentă. Luna afișată cu fmt apare ca nume englezesc (October); ca număr o obții cu int(t.Month()).

Valorile sunt citite în fusul orar al momentului. Același moment poate cădea în zile diferite la București și la New York.

Ce returnează

Date: (year int, month Month, day int). Year și Day: int; Month: time.Month.

Exemple

Exemplul 1: Componentele datei

package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.Date(2026, time.October, 19, 14, 30, 0, 0, time.UTC)

	an, luna, zi := t.Date()
	fmt.Println("Date():", an, luna, zi)
	fmt.Println("Year(): ", t.Year())
	fmt.Println("Month():", t.Month(), "=", int(t.Month()))
	fmt.Println("Day():  ", t.Day())
	fmt.Printf("Format numeric: %02d/%02d/%d\n", zi, luna, an)
}

Rezultat

Date(): 2026 October 19
Year():  2026
Month(): October = 10
Day():   19
Format numeric: 19/10/2026

Exemplul 2: Este aceeași zi?

Comparăm doar data, nu și ora: două evenimente în aceeași zi de calendar.

package main

import (
	"fmt"
	"time"
)

func aceeasiZi(a, b time.Time) bool {
	a1, l1, z1 := a.Date()
	a2, l2, z2 := b.Date()
	return a1 == a2 && l1 == l2 && z1 == z2
}

func main() {
	dimineata := time.Date(2026, 10, 19, 8, 0, 0, 0, time.UTC)
	seara := time.Date(2026, 10, 19, 22, 45, 0, 0, time.UTC)
	maine := time.Date(2026, 10, 20, 0, 5, 0, 0, time.UTC)
	fmt.Println(aceeasiZi(dimineata, seara))
	fmt.Println(aceeasiZi(seara, maine))
}

Rezultat

true
false

Exemplul 3: Vârsta unei persoane

Scădem anii, apoi scădem încă unul dacă ziua de naștere nu a venit încă anul acesta.

package main

import (
	"fmt"
	"time"
)

func varsta(nastere, azi time.Time) int {
	ani := azi.Year() - nastere.Year()
	if azi.Month() < nastere.Month() || (azi.Month() == nastere.Month() && azi.Day() < nastere.Day()) {
		ani--
	}
	return ani
}

func main() {
	azi := time.Date(2026, 10, 19, 0, 0, 0, 0, time.UTC)
	fmt.Println("Ana:", varsta(time.Date(2001, 3, 8, 0, 0, 0, 0, time.UTC), azi))
	fmt.Println("Radu:", varsta(time.Date(2001, 12, 2, 0, 0, 0, 0, time.UTC), azi))
}

Rezultat

Ana: 25
Radu: 24

Greșeli frecvente

  • Afișezi t.Month() și te aștepți la un număr. Apare October; folosește int(t.Month()) sau formatul %02d.

Comenzi înrudite

  • time.Time.Clock: Citește ora dintr-un moment: Clock dă ora, minutul și secunda deodată; Hour, Minute, Second le dau pe rând.
  • time.Time.Weekday: Ziua săptămânii (Weekday), ziua din an (YearDay) și numărul săptămânii ISO (ISOWeek) pentru un moment.
  • time.Month: Tipul pentru lunile anului, de la time.January (1) la time.December (12); String() dă numele englezesc.
  • time.Time.Format: Transformă un moment în text după un model scris cu data de referință 2 ianuarie 2006, 15:04:05.
  • time.Date: Construiește un moment din an, lună, zi, oră, minut, secundă, nanosecundă și fus orar; normalizează valorile prea mari.