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șteAddDate(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.