Arbeiten mit Datum und Zeit in Go: Von den Grundlagen bis zu fortgeschrittenen Techniken
Die Programmiersprache Go (Golang) bietet ein leistungsstarkes und intuitives Paket time für die Arbeit mit Datum und Zeit. Im Gegensatz zu vielen anderen Sprachen verwendet Go einen einzigartigen Ansatz zur Formatierung, der auf einem Referenzdatum basiert (Mon Jan 2 15:04:05 MST 2006). In diesem Artikel werden wir alle wichtigen Aspekte im Detail behandeln: von der Erstellung von Zeitobjekten bis zur Arbeit mit Timern und Zeitzonen. Das Material ist sowohl für Anfänger als auch für erfahrene Entwickler, die zu Go wechseln, nützlich.
1. Grundlagen: Erstellen, Abrufen und Ausgeben von Zeit
Der zentrale Typ für die Arbeit ist time.Time. Den aktuellen Zeitpunkt erhält man mit time.Now(). Zum Erstellen eines bestimmten Datums wird time.Date() verwendet.
package main
import ( "fmt" "time")
func main() { // Aktuelle Zeit now := time.Now() fmt.Println("Jetzt:", now)
// Erstellen eines bestimmten Datums (Jahr, Monat, Tag, Stunde, Min, Sek, Nanosek, Location) specific := time.Date(2025, time.January, 15, 10, 30, 0, 0, time.UTC) fmt.Println("Bestimmtes Datum:", specific)
// Extrahieren der Komponenten fmt.Println("Jahr:", now.Year()) fmt.Println("Monat:", now.Month()) fmt.Println("Tag:", now.Day()) fmt.Println("Stunde:", now.Hour()) fmt.Println("Minute:", now.Minute()) fmt.Println("Sekunde:", now.Second()) fmt.Println("Wochentag:", now.Weekday())}Die Ausgabe des Programms zeigt die aktuelle Zeit und ihre Komponenten. Beachten Sie: time.Now() gibt die Zeit in der lokalen Zeitzone des Systems zurück.
2. Formatierung und Parsing: Die besondere Eigenschaft von Go
In Go erfolgt die Datumsformatierung nicht über Zeichen wie YYYY-MM-DD, sondern über ein Referenzdatum: Mon Jan 2 15:04:05 MST 2006 (oder 01/02 03:04:05PM '06 -0700). Merken Sie sich diese magische Zeichenfolge – sie sieht aus wie 1 2 3 4 5 6 -7.
- 1 — Monat (01, Jan, January)
- 2 — Tag (02, 2)
- 3 — Stunde im 12-Stunden-Format (03, 3)
- 4 — Minute (04, 4)
- 5 — Sekunde (05, 5)
- 6 — Jahr (06, 2006)
- -7 — Zeitzone (MST, -0700, -07:00)
Formatierung (Time → String)
now := time.Now()
// Standardformatefmt.Println(now.Format("2006-01-02 15:04:05")) // 2025-01-15 10:30:45fmt.Println(now.Format("02.01.2006")) // 15.01.2025fmt.Println(now.Format(time.RFC3339)) // 2025-01-15T10:30:45Zfmt.Println(now.Format("Mon, 02 Jan 2006 15:04:05 MST")) // Wed, 15 Jan 2025 10:30:45 UTCParsing (String → Time)
// Parsen eines Strings in time.TimedateStr := "2025-01-15 10:30:45"layout := "2006-01-02 15:04:05"parsedTime, err := time.Parse(layout, dateStr)if err != nil { panic(err)}fmt.Println("Geparst:", parsedTime)
// Parsen mit ZeitzonedateWithZone := "2025-01-15T10:30:45+03:00"parsedWithZone, _ := time.Parse(time.RFC3339, dateWithZone)fmt.Println("Mit Zone:", parsedWithZone)Wenn Sie ein Datum in einer bestimmten Zeitzone parsen müssen, verwenden Sie time.ParseInLocation().
3. Operationen mit Daten: Duration, Add, Sub und Vergleich
Der Typ time.Duration repräsentiert ein Zeitintervall. Go stellt Konstanten bereit: Nanosecond, Microsecond, Millisecond, Second, Minute, Hour.
now := time.Now()
// Zeit hinzufügenfuture := now.Add(72 * time.Hour) // +3 Tagefmt.Println("In 72 Stunden:", future)
// Zeit subtrahierenpast := now.Add(-30 * time.Minute) // 30 Minuten zuvorfmt.P