Créer une heure spécifique
Fait partie de la section Logique & Flux du Journey GO de Coddy. Leçon 59 sur 68.
Alors que time.Now() vous donne le moment présent, vous aurez souvent besoin de travailler avec des dates et des heures précises. Go fournit la fonction time.Date pour créer un objet time.Time représentant la date et l’heure de votre choix.
La fonction time.Date prend huit paramètres dans cet ordre précis : année, mois, jour, heure, minute, seconde, nanoseconde et emplacement. Voici la syntaxe de base :
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)Note que Go utilise des constantes comme time.March pour les mois, ce qui rend ton code plus lisible que si tu utilisais des nombres. Tu peux aussi utiliser des entiers (1-12) si tu préfères. Le paramètre de localisation utilise généralement time.UTC pour l’heure UTC ou time.Local pour le fuseau horaire local de ton système.
Cette approche vous donne un contrôle total sur la création de n’importe quel moment précis, qu’il s’agisse d’un anniversaire, d’une échéance ou d’une date historique. L’objet time.Time obtenu fonctionne exactement comme celui renvoyé par time.Now() et peut être utilisé avec les mêmes opérations temporelles.
Défi
FacileCréez une application de chronologie des événements historiques qui utilise time.Date pour représenter des dates et des heures précises de l’histoire. Ce défi mettra à l’épreuve votre capacité à créer des objets time.Time correspondant à des moments historiques précis et à les afficher dans un format organisé.
Vous recevrez deux entrées :
- Une chaîne contenant des événements historiques au format
"event1:year:month:day:hour:minute,event2:year:month:day:hour:minute"(par exemple,"Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0") - Une chaîne contenant des options d’affichage séparées par des virgules au format
"option1,option2,option3"(par exemple,"chronological,details,summary")
Votre tâche consiste à :
- Analyser la première entrée en la divisant sur les virgules pour obtenir les entrées d’événement individuelles
- Pour chaque entrée d’événement, la diviser sur les deux-points afin d’extraire le nom de l’événement, l’année, le mois, le jour, l’heure et la minute
- Convertir les chaînes numériques en entiers et créer un objet
time.Timeà l’aide detime.Datepour chaque événement (utilisertime.UTCpour le paramètre d’emplacement, et 0 pour les secondes et les nanosecondes) - Afficher l’en-tête de l’application :
"=== HISTORICAL TIMELINE APPLICATION ===" - Afficher la confirmation de chargement des événements :
"Loading historical events..." - Pour chaque événement, afficher :
"Loaded: [event_name] - [complete_time_object]" - Analyser la deuxième entrée en la divisant sur les virgules pour obtenir les options d’affichage
- Traiter chaque option d’affichage :
- Pour
"chronological": afficher"=== CHRONOLOGICAL ORDER ===", puis les événements triés par date (du plus ancien au plus récent), avec le format"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - Pour
"details": afficher"=== DETAILED INFORMATION ===", puis les lignes suivantes pour chaque événement (les quatre dernières sont indentées de deux espaces) :Event: [event_name] Date: [year]-[month]-[day] Time: [hour]:[minute] UTC Weekday: [weekday_name] Unix timestamp: [unix_seconds] - Pour
"summary": afficher"=== TIMELINE SUMMARY ===", puis :"Total events: [number_of_events]""Earliest event: [earliest_event_name] ([year])""Latest event: [latest_event_name] ([year])""Time span: [years_between_earliest_and_latest] years"
- Pour
"years": afficher"=== EVENTS BY DECADE ===", puis les événements regroupés par décennie, au format"[decade]s: [comma_separated_event_names]" - Afficher le message de fin :
"Historical timeline processing completed"
Règles de formatage : la ligne Loaded: affiche la valeur time.Time telle quelle avec %v, par exemple Loaded: Moon Landing - 1969-07-20 20:17:00 +0000 UTC. Toutes les autres dates et heures sont construites manuellement : le mois, le jour et l’heure n’ont pas de zéro initial, et la minute comporte toujours deux chiffres (%02d), de sorte que le même événement s’affiche ainsi : Moon Landing: 1969-7-20 at 20:17 UTC, et la minute 0 s’affiche sous la forme 21:00. [unix_seconds] correspond à Unix(), qui est négatif pour les dates antérieures à 1970. Dans la liste des décennies, celles-ci sont classées de la plus ancienne à la plus récente, et les noms de chaque décennie sont joints par une virgule sans espace, dans l’ordre d’entrée.
Utilisez le package time pour créer des dates précises avec time.Date, le package strings pour diviser les chaînes d’entrée, le package strconv pour convertir les nombres sous forme de chaîne en entiers, et le package fmt pour produire une sortie formatée. N’oubliez pas que time.Date prend les paramètres dans cet ordre exact : année, mois, jour, heure, minute, seconde, nanoseconde, emplacement. Pour trier chronologiquement, vous pouvez comparer les objets time.Time à l’aide de la méthode Before(). Ce défi montre comment créer des moments précis et manipuler des données historiques avec les fonctionnalités temporelles de Go.
Essayez vous-même
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Lire l’entrée avec bufio.Scanner pour gérer correctement les espaces
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
eventsInput := scanner.Text()
scanner.Scan()
optionsInput := scanner.Text()
// Analyser les événements à partir de l’entrée
eventEntries := strings.Split(eventsInput, ",")
// Analyser les options d’affichage à partir de l’entrée
displayOptions := strings.Split(optionsInput, ",")
// TODO: Écrivez votre code ci-dessous
// 1. Analyser chaque entrée d’événement pour extraire le nom, l’année, le mois, le jour, l’heure et la minute
// 2. Penser à vérifier que le slice parts contient suffisamment d’éléments avant d’y accéder
// 3. Convertir les nombres sous forme de chaînes en entiers avec strconv.Atoi()
// 4. Créer des objets time.Time avec time.Date() pour chaque événement
// 5. Afficher l’en-tête de l’application et les messages de chargement
// 6. Traiter chaque option d’affichage (chronological, details, summary, years)
// 7. Afficher le message de fin
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique & Flux
1Structures de contrôle avancées
Switch avec `fallthrough`Sortir de boucles imbriquéesContinuer une boucle spécifiqueL'instruction `goto`Récapitulatif - Contrôle de boucle avancé4Projet : Liste de tâches simple
Configuration du projetAjouter une tâche7Gestion des erreurs en profondeur
Types d'erreurs personnalisésEnvelopper des erreurs avec `%w`Désenvelopper avec `errors.Is`Désenvelopper avec `errors.As`Comprendre `panic`Utiliser `recover`Récapitulatif - Division sécurisée10Travailler avec le temps
Obtenir l'heure actuelleCréer une heure spécifiqueFormatage de l'heureParsing de chaînes de tempsDurée temporelleArithmétique temporelleSleep et TickersRécapitulatif - Minuteur simple2Structures et Méthodes
Définir des méthodes sur des structuresReceveurs par valeurReceveurs par pointeurChoisir les receveursMéthodes vs FonctionsRécapitulatif - Comportement des structures5Les Maps en profondeur
Maps de StructsPointeurs comme valeurs de MapTester les Maps NilComparer des MapsRécapitulatif - Compteur de fréquence de mots3Interfaces (Les bases)
Qu'est-ce qu'une Interface ?Définir une InterfaceImplémenter une InterfaceUtiliser les types d'InterfaceInterface videAssertions de typeType SwitchRécapitulatif - Formes et comportementsEntraînez-vous par vous-même : Compilateur Go en ligne