time.Time.AddDate în Go

Adaugă ani, luni și zile din calendar la o dată (de exemplu scadența peste o lună) și normalizează rezultatul.

Sintaxă
func (t Time) AddDate(years int, months int, days int) Time

Ce face time.Time.AddDate

AddDate lucrează cu calendarul, nu cu ore exacte: t.AddDate(0, 1, 0) înseamnă „aceeași zi, luna următoare”, iar t.AddDate(0, 0, -7) înseamnă „acum o săptămână”. Ora din zi rămâne aceeași, chiar dacă între timp s-a schimbat ora de vară.

Rezultatul este normalizat la fel ca la time.Date. Asta are o consecință importantă: 31 ianuarie plus o lună devine „31 februarie”, adică 3 martie (sau 2 martie în an bisect). Pentru „ultima zi a lunii următoare” calculează explicit, ca în al doilea exemplu.

Parametri

Parametru Descriere
years Numărul de ani (poate fi negativ).
months Numărul de luni.
days Numărul de zile.

Ce returnează

Un time.Time nou, cu data mutată.

Exemple

Exemplul 1: Scadențe și aniversări

package main

import (
	"fmt"
	"time"
)

func main() {
	factura := time.Date(2026, time.October, 19, 10, 0, 0, 0, time.UTC)
	fmt.Println("Emisă:         ", factura.Format("02.01.2006"))
	fmt.Println("Scadentă (+30z):", factura.AddDate(0, 0, 30).Format("02.01.2006"))
	fmt.Println("Peste o lună:  ", factura.AddDate(0, 1, 0).Format("02.01.2006"))
	fmt.Println("Peste un an:   ", factura.AddDate(1, 0, 0).Format("02.01.2006"))
	fmt.Println("Acum o săptămână:", factura.AddDate(0, 0, -7).Format("02.01.2006"))
}

Rezultat

Emisă:          19.10.2026
Scadentă (+30z): 18.11.2026
Peste o lună:   19.11.2026
Peste un an:    19.10.2027
Acum o săptămână: 12.10.2026

Exemplul 2: Capcana sfârșitului de lună

31 ianuarie + o lună „sare” în martie. Ultima zi a unei luni se obține cerând ziua 0 a lunii următoare.

package main

import (
	"fmt"
	"time"
)

func ultimaZi(an int, luna time.Month) time.Time {
	// ziua 0 a lunii următoare = ultima zi a lunii curente
	return time.Date(an, luna+1, 0, 0, 0, 0, 0, time.UTC)
}

func main() {
	t := time.Date(2026, time.January, 31, 0, 0, 0, 0, time.UTC)
	fmt.Println("31.01 + 1 lună:", t.AddDate(0, 1, 0).Format("02.01.2006"))
	fmt.Println("Ultima zi din feb 2026:", ultimaZi(2026, time.February).Format("02.01.2006"))
	fmt.Println("Ultima zi din feb 2028:", ultimaZi(2028, time.February).Format("02.01.2006"))
}

Rezultat

31.01 + 1 lună: 03.03.2026
Ultima zi din feb 2026: 28.02.2026
Ultima zi din feb 2028: 29.02.2028

Greșeli frecvente

  • Adaugi o lună la 29, 30 sau 31 și te aștepți să rămâi în luna următoare. Rezultatul poate fi în luna de după; verifică sau calculează ultima zi a lunii.
  • Folosești Add(30 * 24 * time.Hour) pentru „o lună”. Lunile au lungimi diferite; folosește AddDate(0, 1, 0).

Comenzi înrudite

  • time.Time.Add: Returnează momentul mutat înainte (sau înapoi, cu durată negativă) cu o durată exactă: ore, minute, secunde.
  • time.Date: Construiește un moment din an, lună, zi, oră, minut, secundă, nanosecundă și fus orar; normalizează valorile prea mari.
  • time.Time: Tipul care ține un moment în timp: dată, oră, nanosecunde și fusul orar. Se creează cu time.Date sau time.Now.
  • time.Month: Tipul pentru lunile anului, de la time.January (1) la time.December (12); String() dă numele englezesc.