Einen bestimmten Zeitpunkt erstellen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 59 von 68.
Während time.Now() Ihnen den aktuellen Moment liefert, müssen Sie oft mit bestimmten Daten und Zeiten arbeiten. Go bietet die Funktion time.Date zum Erstellen eines time.Time-Objekts, das ein beliebiges von Ihnen angegebenes Datum und eine beliebige Zeit darstellt.
Die time.Date-Funktion nimmt acht Parameter in genau dieser Reihenfolge entgegen: Jahr, Monat, Tag, Stunde, Minute, Sekunde, Nanosekunde und Standort (Location). Hier ist die grundlegende Syntax:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)Beachten Sie, dass Go Konstanten wie time.March für Monate verwendet, was Ihren Code lesbarer macht als die Verwendung von Zahlen. Sie können auch Ganzzahlen (1-12) verwenden, wenn Sie dies bevorzugen. Der location-Parameter verwendet normalerweise time.UTC für die UTC-Zeit oder time.Local für die lokale Zeitzone Ihres Systems.
Dieser Ansatz gibt Ihnen die vollständige Kontrolle über die Erstellung jedes spezifischen Zeitpunkts, sei es ein Geburtstag, eine Frist oder ein historisches Datum. Das resultierende time.Time-Objekt funktioniert genau wie das von time.Now() und kann mit all denselben Zeitoperationen verwendet werden.
Aufgabe
EinfachErstellen Sie eine Anwendung für eine historische Ereignis-Timeline, die time.Date verwendet, um spezifische Daten und Zeiten aus der Geschichte darzustellen. Diese Herausforderung testet Ihre Fähigkeit, time.Time-Objekte für präzise historische Momente zu erstellen und diese in einem organisierten Format anzuzeigen.
Sie erhalten zwei Eingaben:
- Einen String, der historische Ereignisse im Format
"event1:year:month:day:hour:minute,event2:year:month:day:hour:minute"enthält (z. B."Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0") - Einen String, der Anzeigeoptionen enthält, getrennt durch Kommas im Format
"option1,option2,option3"(z. B."chronological,details,summary")
Ihre Aufgabe ist es:
- Die erste Eingabe zu parsen, indem Sie sie an den Kommas trennen, um einzelne Ereigniseinträge zu erhalten
- Für jeden Ereigniseintrag an den Doppelpunkten zu trennen, um den Ereignisnamen, das Jahr, den Monat, den Tag, die Stunde und die Minute zu extrahieren
- Die numerischen Strings in Ganzzahlen umzuwandeln und ein
time.Time-Objekt unter Verwendung vontime.Datefür jedes Ereignis zu erstellen (verwenden Sietime.UTCfür den Standortparameter und 0 für Sekunden und Nanosekunden) - Den Anwendungs-Header anzuzeigen:
"=== HISTORICAL TIMELINE APPLICATION ===" - Die Bestätigung für das Laden der Ereignisse anzuzeigen:
"Loading historical events..." - Für jedes Ereignis anzuzeigen:
"Loaded: [event_name] - [complete_time_object]" - Die zweite Eingabe zu parsen, indem Sie sie an den Kommas trennen, um die Anzeigeoptionen zu erhalten
- Jede Anzeigeoption zu verarbeiten:
- Für
"chronological": Zeigen Sie"=== CHRONOLOGICAL ORDER ==="an, gefolgt von den nach Datum sortierten Ereignissen (das früheste zuerst), im Format"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - Für
"details": Zeigen Sie"=== DETAILED INFORMATION ==="an, gefolgt von jedem Ereignis mit:"Event: [event_name]"" Date: [year]-[month]-[day]"" Time: [hour]:[minute] UTC"" Weekday: [weekday_name]"" Unix timestamp: [unix_seconds]"
- Für
"summary": Zeigen Sie"=== TIMELINE SUMMARY ==="an, gefolgt von:"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"
- Für
"years": Zeigen Sie"=== EVENTS BY DECADE ==="an, gefolgt von den nach Jahrzehnten gruppierten Ereignissen, im Format"[decade]s: [comma_separated_event_names]" - Die Abschlussmeldung anzuzeigen:
"Historical timeline processing completed"
Verwenden Sie das time-Paket, um spezifische Daten mit time.Date zu erstellen, das strings-Paket, um Eingabestrings zu trennen, das strconv-Paket, um String-Zahlen in Ganzzahlen umzuwandeln, und das fmt-Paket für die formatierte Ausgabe. Denken Sie daran, dass time.Date Parameter in der exakten Reihenfolge erwartet: Jahr, Monat, Tag, Stunde, Minute, Sekunde, Nanosekunde, Standort. Für die chronologische Sortierung können Sie time.Time-Objekte mit der Methode Before() vergleichen. Diese Herausforderung demonstriert, wie man spezifische Zeitpunkte erstellt und mit historischen Daten unter Verwendung der Zeitfunktionalität von Go arbeitet.
Probier es selbst
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Eingabe mit bufio.Scanner lesen, um Leerzeichen korrekt zu verarbeiten
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
eventsInput := scanner.Text()
scanner.Scan()
optionsInput := scanner.Text()
// Events aus der Eingabe parsen
eventEntries := strings.Split(eventsInput, ",")
// Anzeigeoptionen aus der Eingabe parsen
displayOptions := strings.Split(optionsInput, ",")
// TODO: Schreibe deinen Code unten
// 1. Jeden Event-Eintrag parsen, um name, year, month, day, hour, minute zu extrahieren
// 2. Denke daran zu prüfen, ob der parts Slice genügend Elemente hat, bevor darauf zugegriffen wird
// 3. String-Zahlen mit strconv.Atoi() in Integer umwandeln
// 4. time.Time Objekte mit time.Date() für jedes Event erstellen
// 5. Den Anwendungs-Header und Lade-Nachrichten anzeigen
// 6. Jede Anzeigeoption verarbeiten (chronological, details, summary, years)
// 7. Die Abschlussmeldung anzeigen
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen7Fehlerbehandlung im Detail
Benutzerdefinierte FehlertypenFehler-Wrapping mit `%w`Unwrapping mit `errors.Is`Unwrapping mit `errors.As``panic` verstehen`recover` verwendenZusammenfassung – Sichere Division10Arbeiten mit Zeit
Aktuelle Zeit abrufenEinen bestimmten Zeitpunkt erstellenZeit formatierenZeit-Strings parsenZeitdauerZeitarithmetikSleeping und TickerZusammenfassung – Einfacher Timer2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und Verhalten