time.Time.Truncate în Go

Rotunjește un moment la un multiplu de durată: Truncate în jos, Round la cel mai apropiat (ex. la ora sau sfertul de oră).

Sintaxă
func (t Time) Truncate(d Duration) Time
func (t Time) Round(d Duration) Time

Ce face time.Time.Truncate

t.Truncate(time.Hour) taie minutele și secundele: 14:47 devine 14:00. t.Round(15 * time.Minute) duce momentul la cel mai apropiat sfert de oră: 14:47 devine 14:45, iar 14:53 devine 15:00. La egalitate, Round rotunjește în sus.

Calculul se face pe timpul absolut (de la anul 1, în UTC), nu pe ora afișată. Pentru ore, minute și secunde nu contează, dar Truncate(24 * time.Hour) dă miezul nopții în UTC, nu miezul nopții la București. Pentru începutul zilei locale folosește time.Date(an, luna, zi, 0, 0, 0, 0, loc).

Parametri

Parametru Descriere
d Durata la care rotunjești: time.Hour, 15 * time.Minute, time.Second. Dacă d <= 0, momentul rămâne neschimbat.

Ce returnează

Un time.Time nou, rotunjit.

Exemple

Exemplul 1: Rotunjiri la oră și la sfert de oră

package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.Date(2026, 10, 19, 14, 47, 31, 0, time.UTC)
	fmt.Println("Original:              ", t.Format("15:04:05"))
	fmt.Println("Truncate(Hour):        ", t.Truncate(time.Hour).Format("15:04:05"))
	fmt.Println("Truncate(15*Minute):   ", t.Truncate(15*time.Minute).Format("15:04:05"))
	fmt.Println("Round(15*Minute):      ", t.Round(15*time.Minute).Format("15:04:05"))
	fmt.Println("Round(Hour):           ", t.Round(time.Hour).Format("15:04:05"))
	fmt.Println("Round(Minute):         ", t.Round(time.Minute).Format("15:04:05"))
}

Rezultat

Original:               14:47:31
Truncate(Hour):         14:00:00
Truncate(15*Minute):    14:45:00
Round(15*Minute):       14:45:00
Round(Hour):            15:00:00
Round(Minute):          14:48:00

Exemplul 2: Gruparea comenzilor pe ore

Truncate(time.Hour) dă aceeași cheie pentru toate comenzile din aceeași oră.

package main

import (
	"fmt"
	"time"
)

func main() {
	ora := func(h, m int) time.Time { return time.Date(2026, 10, 19, h, m, 0, 0, time.UTC) }
	comenzi := []time.Time{ora(9, 5), ora(9, 40), ora(10, 2), ora(10, 15), ora(10, 59), ora(12, 30)}

	numar := map[string]int{}
	for _, c := range comenzi {
		numar[c.Truncate(time.Hour).Format("15:04")]++
	}
	fmt.Println(numar)
}

Rezultat

map[09:00:2 10:00:3 12:00:1]

Greșeli frecvente

  • Folosești Truncate(24 * time.Hour) pentru „începutul zilei” într-un fus diferit de UTC; rezultatul este miezul nopții UTC (ex. 03:00 la București). Construiește data cu time.Date.

Comenzi înrudite

  • time.Duration.Round: Rotunjește o durată la un multiplu: Round la cel mai apropiat, Truncate în jos (ex. la secundă pentru afișare).
  • 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: Tipul care ține un moment în timp: dată, oră, nanosecunde și fusul orar. Se creează cu time.Date sau time.Now.