Introduction au travail avec les dates et l'heure en Go
\nTravailler avec les dates et l'heure est l'une des tâches clés dans toute application sérieuse. Qu'il s'agisse de journalisation d'événements, de calcul de délais d'attente, de gestion d'horaires ou d'analyse de séries temporelles, le langage Go fournit une boîte à outils puissante et élégante dans le package standard time. Dans cet article, nous allons aborder le travail avec les dates et l'heure en Go de A à Z : de la création d'objets temporels aux opérations complexes avec les fuseaux horaires et les minuteurs.
Les bases : la structure time.Time et la création de dates
\nL'élément central du package time est la structure time.Time. Elle représente un instant dans le temps avec une précision à la nanoseconde et des informations sur le fuseau horaire.
Obtenir l'heure actuelle
\nLe scénario le plus courant est d'obtenir l'instant présent :
\npackage main\n\nimport (\n "fmt"\n "time"\n)\n\nfunc main() {\n now := time.Now()\n fmt.Println("Heure actuelle :", now)\n}\n\nCréer une date spécifique
\nPour créer une date, on utilise la fonction time.Date(). Notez qu'en Go, les mois sont spécifiés via des constantes (time.January, time.February, etc.) ou par un nombre de 1 à 12.
func main() {\n // 15 mars 2025, 14:30:00, UTC\n specificDate := time.Date(2025, time.March, 15, 14, 30, 0, 0, time.UTC)\n fmt.Println("Date spécifique :", specificDate)\n \n // Création avec des nanosecondes\n preciseDate := time.Date(2025, 3, 15, 14, 30, 0, 123456789, time.UTC)\n fmt.Println("Date précise :", preciseDate)\n}\n\nFormatage et analyse des dates
\nGo utilise une approche unique pour le formatage : au lieu de codes comme %Y-%m-%d, vous utilisez l'heure de référence Mon Jan 2 15:04:05 MST 2006 (qui se lit comme 01 02 03 04 05 06 07 — année, mois, jour, heure, minute, seconde, année).
Formatage (time → chaîne)
\nLa méthode Format() convertit l'heure en une chaîne selon un modèle donné :
func main() {\n now := time.Now()\n \n // Formats standards\n fmt.Println("RFC3339 :", now.Format(time.RFC3339))\n fmt.Println("Date :", now.Format("2006-01-02"))\n fmt.Println("Heure :", now.Format("15:04:05"))\n fmt.Println("Format complet :", now.Format("02.01.2006 15:04:05"))\n fmt.Println("Avec le jour de la semaine :", now.Format("Mon, 02 Jan 2006"))\n}\n\nAnalyse (chaîne → time.Time)
\nLa fonction time.Parse() analyse une chaîne en une structure temporelle. Important : le modèle doit correspondre exactement au format de la chaîne d'entrée.
func main() {\n // Analyse avec un format connu\n dateStr := "2025-03-15 14:30:00"\n parsed, err := time.Parse("2006-01-02 15:04:05", dateStr)\n if err != nil {\n panic(err)\n }\n fmt.Println("Analysé :", parsed)\n \n // Analyse avec un fuseau horaire\n dateWithZone := "2025-03-15T14:30:00+03:00"\n parsedWithZone, _ := time.Parse(time.RFC3339, dateWithZone)\n fmt.Println("Avec fuseau horaire :", parsedWithZone)\n}\n\nArithmétique temporelle : intervalles et comparaisons
\nLe package time fournit le type Duration pour représenter les intervalles de temps et des méthodes pour les opérations arithmétiques.
Addition et soustraction
\nfunc main() {\n now := time.Now()\n \n // Ajout de 2 heures 30 minutes\n future := now.Add(2*time.Hour + 30*time.Minute)\n fmt.Println("Dans 2,5 heures :", future)\n \n // Soustraction de 7 jours\n past := now.Add(-7 * 24 * time.Hour)\n fmt.Println("Il y a une semaine :", past)\n \n // Utilisation de AddDate pour travailler avec des dates calendaires\n nextMonth := now.AddDate(0, 1, 0)\n fmt.Println("Dans un mois :", nextMonth)\n}\n\nCalcul de la différence entre deux dates
\nLa méthode Sub() retourne une Duration :
func main() {\n start := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)\n end