time.Parse în Go

Citește o dată din text după un model (2006-01-02 15:04); ParseInLocation o interpretează într-un fus orar dat.

Sintaxă
func Parse(layout, value string) (Time, error)
func ParseInLocation(layout, value string, loc *Location) (Time, error)   // Go 1.1

Ce face time.Parse

time.Parse(model, text) face operația inversă lui Format: transformă un text ca "19.10.2026 14:30" într-un time.Time. Modelul se scrie cu aceeași dată de referință, Mon Jan 2 15:04:05 MST 2006: "02.01.2006 15:04", "2006-01-02", sau constante ca time.RFC3339 și time.DateOnly. Spre deosebire de time.Date, Parse verifică datele: 31.02.2026 dă eroare.

Dacă textul nu conține fusul orar, Parse consideră ora în UTC. Pentru texte scrise în ora locală a utilizatorului (de exemplu dintr-un formular românesc) folosește time.ParseInLocation(model, text, loc), care interpretează ora în zona loc. Dacă textul conține fusul (+03:00, Z), acesta este respectat de ambele.

Erorile sunt de tip *time.ParseError și spun ce parte nu se potrivește (month out of range, cannot parse ... as "2006").

Parametri

Parametru Descriere
layout Modelul textului, scris cu data de referință.
value Textul de citit.
loc Fusul orar în care se interpretează ora (doar la ParseInLocation).

Ce returnează

Momentul citit și o eroare.

Exemple

Exemplul 1: Date în formate diferite

package main

import (
	"fmt"
	"time"
)

func main() {
	intrari := []struct{ model, text string }{
		{"02.01.2006", "19.10.2026"},
		{"02.01.2006 15:04", "25.12.2026 18:30"},
		{time.DateOnly, "2026-03-08"},
		{time.RFC3339, "2026-10-19T14:30:00+03:00"},
		{"2 January 2006", "1 December 2026"},
	}
	for _, in := range intrari {
		t, err := time.Parse(in.model, in.text)
		if err != nil {
			fmt.Println("eroare:", err)
			continue
		}
		fmt.Printf("%-26s -> %s\n", in.text, t)
	}
}

Rezultat

19.10.2026                 -> 2026-10-19 00:00:00 +0000 UTC
25.12.2026 18:30           -> 2026-12-25 18:30:00 +0000 UTC
2026-03-08                 -> 2026-03-08 00:00:00 +0000 UTC
2026-10-19T14:30:00+03:00  -> 2026-10-19 14:30:00 +0300 EEST
1 December 2026            -> 2026-12-01 00:00:00 +0000 UTC

Exemplul 2: Validarea datei introduse de utilizator

package main

import (
	"fmt"
	"time"
)

func main() {
	for _, text := range []string{"29.02.2028", "29.02.2027", "31.04.2026", "2026-10-19", "19.13.2026"} {
		t, err := time.Parse("02.01.2006", text)
		if err != nil {
			fmt.Printf("%-11s invalid: %v\n", text, err)
			continue
		}
		fmt.Printf("%-11s ok, %s\n", text, t.Weekday())
	}
}

Rezultat

29.02.2028  ok, Tuesday
29.02.2027  invalid: parsing time "29.02.2027": day out of range
31.04.2026  invalid: parsing time "31.04.2026": day out of range
2026-10-19  invalid: parsing time "2026-10-19" as "02.01.2006": cannot parse "26-10-19" as "."
19.13.2026  invalid: parsing time "19.13.2026": month out of range

Exemplul 3: Ora românească: Parse față de ParseInLocation

Un formular trimite „19.10.2026 14:30”, ora României. Parse o ia drept UTC (greșit cu 3 ore); ParseInLocation o interpretează corect.

package main

import (
	"fmt"
	"time"
)

func main() {
	buc, err := time.LoadLocation("Europe/Bucharest")
	if err != nil {
		fmt.Println(err)
		return
	}
	const model = "02.01.2006 15:04"
	a, _ := time.Parse(model, "19.10.2026 14:30")
	b, _ := time.ParseInLocation(model, "19.10.2026 14:30", buc)

	fmt.Println("Parse:          ", a, "| în UTC:", a.UTC().Format("15:04"))
	fmt.Println("ParseInLocation:", b, "| în UTC:", b.UTC().Format("15:04"))
	fmt.Println("Diferență:", a.Sub(b))
}

Rezultat

Parse:           2026-10-19 14:30:00 +0000 UTC | în UTC: 14:30
ParseInLocation: 2026-10-19 14:30:00 +0300 EEST | în UTC: 11:30
Diferență: 3h0m0s

Greșeli frecvente

  • Inversezi argumentele: time.Parse("19.10.2026", "02.01.2006"). Primul este modelul, al doilea textul.
  • Scrii modelul cu altă dată ("19.10.2026" sau "DD.MM.YYYY"): doar data de referință 2006-01-02 15:04:05 funcționează ca model.
  • Folosești Parse pentru ore locale fără fus în text și salvezi rezultatul: toate orele sunt decalate cu 2-3 ore. Folosește ParseInLocation.

Comenzi înrudite

  • time.Time.Format: Transformă un moment în text după un model scris cu data de referință 2 ianuarie 2006, 15:04:05.
  • time.LoadLocation: Obține un fus orar: LoadLocation după nume („Europe/Bucharest”), din date brute (FromTZData) sau cu decalaj fix (FixedZone).
  • time.Date: Construiește un moment din an, lună, zi, oră, minut, secundă, nanosecundă și fus orar; normalizează valorile prea mari.
  • time.ParseDuration: Citește o durată scrisă ca text („1h30m”, „250ms”, „2.5s”) într-un time.Duration; util pentru setări.