Ce face time.Now
time.Now() citește ceasul calculatorului și returnează un time.Time cu data și ora de acum, în fusul orar local (time.Local). Pe un server care rulează în UTC, ora va fi UTC; pentru ora României convertește cu t.In(loc).
Pe lângă ora obișnuită (ceasul „de perete”), valoarea conține și o citire a ceasului monoton, un contor care doar crește și nu sare când se schimbă ora sistemului (sincronizare NTP, schimbarea manuală a orei). Când scazi două momente obținute cu Now (Sub, time.Since), Go folosește ceasul monoton, deci durata este corectă. La afișare citirea apare la final ca m=+0.000041; t.Round(0) o elimină.
Pentru că rezultatul se schimbă la fiecare rulare, codul care depinde de Now este greu de testat. O soluție obișnuită este să primești momentul ca parametru (func raport(acum time.Time)) și să apelezi Now doar în main.
Ce returnează
Momentul curent (time.Time).
Exemple
Exemplul 1: Ora curentă și componentele ei
Rezultatul diferă la fiecare rulare.
package main
import (
"fmt"
"time"
)
func main() {
acum := time.Now()
fmt.Println(acum)
fmt.Println(acum.Format("02.01.2006 15:04:05"))
fmt.Println("Anul:", acum.Year(), "- ziua:", acum.Weekday(), "- fusul:", acum.Location())
fmt.Println("Fără ceasul monoton:", acum.Round(0))
}
Rezultat posibil (diferă la fiecare rulare)
2026-10-19 14:07:31.524318 +0300 EEST m=+0.000041251
19.10.2026 14:07:31
Anul: 2026 - ziua: Monday - fusul: Local
Fără ceasul monoton: 2026-10-19 14:07:31.524318 +0300 EEST
Exemplul 2: Fapte stabile despre momentul curent
Afișăm doar comparații care sunt adevărate la orice rulare: momentul curent este după o dată din trecut, iar două citiri succesive nu merg înapoi.
package main
import (
"fmt"
"time"
)
func main() {
lansare := time.Date(2026, time.January, 1, 0, 0, 0, 0, time.UTC)
a := time.Now()
b := time.Now()
fmt.Println("Suntem după 1 ianuarie 2026:", a.After(lansare))
fmt.Println("A doua citire nu e înaintea primei:", !b.Before(a))
fmt.Println("Diferența este mică:", b.Sub(a) < time.Second)
fmt.Println("Fusul orar al lui Now:", a.Location())
}
Rezultat
Suntem după 1 ianuarie 2026: true
A doua citire nu e înaintea primei: true
Diferența este mică: true
Fusul orar al lui Now: Local
Exemplul 3: Momentul curent primit ca parametru
Funcția salut nu apelează Now, deci poate fi verificată cu orice oră fixă.
package main
import (
"fmt"
"time"
)
func salut(acum time.Time) string {
switch h := acum.Hour(); {
case h < 12:
return "Bună dimineața"
case h < 18:
return "Bună ziua"
}
return "Bună seara"
}
func main() {
for _, ora := range []int{7, 13, 20} {
fmt.Printf("%02d:00 -> %s\n", ora, salut(time.Date(2026, 10, 19, ora, 0, 0, 0, time.UTC)))
}
_ = salut(time.Now()) // în program: ora reală
}
Rezultat
07:00 -> Bună dimineața
13:00 -> Bună ziua
20:00 -> Bună seara
Greșeli frecvente
- Măsori durate cu
time.Now().Unix()scăzute ca numere: pierzi ceasul monoton și precizia. Scade momentele direct (time.Since(start)). - Compari ieșirea lui
fmt.Println(time.Now())sau o salvezi ca text: conținem=+.... Formatează cuFormatsau elimină citirea cuRound(0). - Presupui că
Nowdă ora României pe server. Serverele sunt de obicei în UTC; foloseștetime.LoadLocation("Europe/Bucharest")șiIn.
Comenzi înrudite
time.Since: Since: cât timp a trecut de la t până acum; Until: cât timp mai este până la t. Ambele returnează time.Duration.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.Time.Format: Transformă un moment în text după un model scris cu data de referință 2 ianuarie 2006, 15:04:05.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.