Einführung in die Arbeit mit Datum und Uhrzeit in Go
Die Arbeit mit Datum und Uhrzeit ist eine der Kernaufgaben in jeder ernsthaften Anwendung. Ob es um die Protokollierung von Ereignissen, die Berechnung von Timeouts, die Arbeit mit Zeitplänen oder die Analyse von Zeitreihen geht, die Sprache Go bietet ein leistungsstarkes und elegantes Toolkit im Standardpaket time. In diesem Artikel behandeln wir die Arbeit mit Datum und Uhrzeit in Go von A bis Z: von der Erstellung von Zeitobjekten bis hin zu komplexen Operationen mit Zeitzonen und Timern.
Grundlagen: Die Struktur time.Time und das Erstellen von Daten
Das zentrale Element des Pakets time ist die Struktur time.Time. Sie repräsentiert einen Zeitpunkt mit Nanosekunden-Genauigkeit und Informationen zur Zeitzone.
Aktuelle Zeit abrufen
Das häufigste Szenario ist das Abrufen des aktuellen Zeitpunkts:
package main
import ( "fmt" "time")
func main() { now := time.Now() fmt.Println("Aktuelle Zeit:", now)}Erstellen eines bestimmten Datums
Zum Erstellen eines Datums wird die Funktion time.Date() verwendet. Beachten Sie: In Go werden Monate über Konstanten (time.January, time.February usw.) oder als Zahl von 1 bis 12 angegeben.
func main() { // 15. März 2025, 14:30:00, UTC specificDate := time.Date(2025, time.March, 15, 14, 30, 0, 0, time.UTC) fmt.Println("Bestimmtes Datum:", specificDate) // Erstellen mit Nanosekunden preciseDate := time.Date(2025, 3, 15, 14, 30, 0, 123456789, time.UTC) fmt.Println("Präzises Datum:", preciseDate)}Formatieren und Parsen von Daten
Go verwendet einen einzigartigen Ansatz zur Formatierung: Anstelle von Codes wie %Y-%m-%d verwenden Sie die Referenzzeit Mon Jan 2 15:04:05 MST 2006 (die als 01 02 03 04 05 06 07 gelesen wird – Jahr, Monat, Tag, Stunde, Minute, Sekunde, Jahr).
Formatieren (time → String)
Die Methode Format() wandelt die Zeit gemäß einer angegebenen Vorlage in einen String um:
func main() { now := time.Now() // Standardformate fmt.Println("RFC3339:", now.Format(time.RFC3339)) fmt.Println("Datum:", now.Format("2006-01-02")) fmt.Println("Uhrzeit:", now.Format("15:04:05")) fmt.Println("Vollformat:", now.Format("02.01.2006 15:04:05")) fmt.Println("Mit Wochentag:", now.Format("Mon, 02 Jan 2006"))}Parsen (String → time.Time)
Die Funktion time.Parse() zerlegt einen String in eine Zeitstruktur. Wichtig: Die Vorlage muss exakt dem Format des Eingabestrings entsprechen.
func main() { // Parsen mit bekanntem Format dateStr := "2025-03-15 14:30:00" parsed, err := time.Parse("2006-01-02 15:04:05", dateStr) if err != nil { panic(err) } fmt.Println("Geparst:", parsed) // Parsen mit Zeitzone dateWithZone := "2025-03-15T14:30:00+03:00" parsedWithZone, _ := time.Parse(time.RFC3339, dateWithZone) fmt.Println("Mit Zeitzone:", parsedWithZone)}Zeitarithmetik: Intervalle und Vergleiche
Das Paket time stellt den Typ Duration zur Darstellung von Zeitintervallen und Methoden für arithmetische Operationen bereit.
Addition und Subtraktion
func main() { now := time.Now() // Hinzufügen von 2 Stunden 30 Minuten future := now.Add(2*time.Hour + 30*time.Minute) fmt.Println("In 2,5 Stunden:", future) // Subtraktion von 7 Tagen past := now.Add(-7 * 24 * time.Hour) fmt.Println("Vor einer Woche:", past) // Verwendung von AddDate für kalendarische Daten nextMonth := now.AddDate(0, 1, 0) fmt.Println("In einem Monat:", nextMonth)}Berechnung der Differenz zwischen Daten
Die Methode Sub() gibt eine Duration zurück:
func main() { start := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC) end