time.Time.Before în Go

Before, After și Equal compară două momente: este t înainte, după sau exact în același moment cu u?

Sintaxă
func (t Time) Before(u Time) bool
func (t Time) After(u Time) bool
func (t Time) Equal(u Time) bool

Ce face time.Time.Before

t.Before(u) este true dacă t este strict înainte de u, t.After(u) dacă este strict după, iar t.Equal(u) dacă reprezintă același moment.

Equal compară momentul, nu felul în care este scris: 14:30 la București (UTC+3) și 11:30 UTC sunt același moment, deci Equal dă true. Operatorul == compară și fusul orar (și citirea internă a ceasului monoton) și poate da false pentru același moment.

Pentru „între două date, inclusiv capetele” scrii !t.Before(start) && !t.After(sfarsit).

Parametri

Parametru Descriere
u Momentul cu care compari.

Ce returnează

bool.

Exemple

Exemplul 1: Termen depășit sau nu

package main

import (
	"fmt"
	"time"
)

func main() {
	termen := time.Date(2026, time.October, 20, 23, 59, 0, 0, time.UTC)
	predari := map[string]time.Time{
		"Ana":   time.Date(2026, time.October, 19, 18, 0, 0, 0, time.UTC),
		"Ion":   time.Date(2026, time.October, 21, 8, 30, 0, 0, time.UTC),
		"Elena": termen,
	}
	for _, nume := range []string{"Ana", "Ion", "Elena"} {
		p := predari[nume]
		switch {
		case p.Before(termen):
			fmt.Println(nume, "a predat la timp")
		case p.Equal(termen):
			fmt.Println(nume, "a predat chiar la termen")
		case p.After(termen):
			fmt.Println(nume, "a întârziat")
		}
	}
}

Rezultat

Ana a predat la timp
Ion a întârziat
Elena a predat chiar la termen

Exemplul 2: Equal față de ==

Același moment, scris în două fusuri orare: Equal spune true, == spune false.

package main

import (
	"fmt"
	"time"
)

func main() {
	ro := time.FixedZone("EEST", 3*60*60)
	a := time.Date(2026, time.October, 19, 14, 30, 0, 0, ro)
	b := time.Date(2026, time.October, 19, 11, 30, 0, 0, time.UTC)

	fmt.Println(a)
	fmt.Println(b)
	fmt.Println("a.Equal(b):", a.Equal(b))
	fmt.Println("a == b:    ", a == b)

	start := time.Date(2026, 10, 1, 0, 0, 0, 0, time.UTC)
	sfarsit := time.Date(2026, 10, 31, 0, 0, 0, 0, time.UTC)
	inInterval := !b.Before(start) && !b.After(sfarsit)
	fmt.Println("În octombrie:", inInterval)
}

Rezultat

2026-10-19 14:30:00 +0300 EEST
2026-10-19 11:30:00 +0000 UTC
a.Equal(b): true
a == b:     false
În octombrie: true

Greșeli frecvente

  • Folosești == sau chei de map de tip time.Time pentru momente venite din surse diferite. Folosește Equal sau normalizează întâi cu t.UTC().
  • Uiți că Before și After sunt stricte: pentru momente egale ambele dau false.

Comenzi înrudite

  • time.Time.Compare: Compară două momente și returnează -1, 0 sau +1; potrivită pentru sortarea cu slices.SortFunc.
  • time.Time.Sub: Calculează cât timp a trecut între două momente și returnează diferența ca time.Duration.
  • 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.
  • time.Time: Tipul care ține un moment în timp: dată, oră, nanosecunde și fusul orar. Se creează cu time.Date sau time.Now.