Einen bestimmten Zeitpunkt erstellen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 59 von 68.
Während time.Now() dir den aktuellen Zeitpunkt liefert, musst du oft mit bestimmten Datums- und Zeitangaben arbeiten. Go bietet die Funktion time.Date, um ein time.Time-Objekt zu erstellen, das ein beliebiges Datum und eine beliebige Uhrzeit darstellt, die du angibst.
Die Funktion time.Date nimmt acht Parameter in genau dieser Reihenfolge entgegen: Jahr, Monat, Tag, Stunde, Minute, Sekunde, Nanosekunde und Zeitzone. Hier ist die grundlegende Syntax:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)Beachte, dass Go Konstanten wie time.March für Monate verwendet, wodurch dein Code lesbarer wird als bei der Verwendung von Zahlen. Du kannst auch Ganzzahlen (1–12) verwenden, wenn du das bevorzugst. Für den Standortparameter wird typischerweise time.UTC für die UTC-Zeit oder time.Local für die lokale Zeitzone deines Systems verwendet.
Dieser Ansatz gibt dir die vollständige Kontrolle darüber, jeden beliebigen Zeitpunkt zu erstellen, sei es ein Geburtstag, eine Frist oder ein historisches Datum. Das resultierende time.Time-Objekt funktioniert genau wie das von time.Now() und kann für dieselben Zeitoperationen verwendet werden.
Aufgabe
EinfachErstelle eine Anwendung für eine Zeitleiste historischer Ereignisse, die time.Date verwendet, um bestimmte historische Daten und Uhrzeiten darzustellen. Diese Herausforderung prüft deine Fähigkeit, time.Time-Objekte für präzise historische Zeitpunkte zu erstellen und sie in einem geordneten Format anzuzeigen.
Du erhältst zwei Eingaben:
- Eine Zeichenfolge mit historischen Ereignissen im Format
"event1:year:month:day:hour:minute,event2:year:month:day:hour:minute"(z. B."Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0") - Eine Zeichenfolge mit durch Kommas getrennten Anzeigeoptionen im Format
"option1,option2,option3"(z. B."chronological,details,summary")
Deine Aufgabe ist es:
- Die erste Eingabe durch Aufteilen an Kommas zu verarbeiten, um einzelne Ereigniseinträge zu erhalten
- Jeden Ereigniseintrag an Doppelpunkten aufzuteilen, um den Ereignisnamen, das Jahr, den Monat, den Tag, die Stunde und die Minute zu extrahieren
- Die numerischen Zeichenfolgen in Ganzzahlen umzuwandeln und für jedes Ereignis mit
time.Dateeintime.Time-Objekt zu erstellen (verwendetime.UTCals Ortsparameter sowie 0 für Sekunden und Nanosekunden) - Die Kopfzeile der Anwendung anzuzeigen:
"=== HISTORICAL TIMELINE APPLICATION ===" - Die Bestätigung für das Laden der Ereignisse anzuzeigen:
"Loading historical events..." - Für jedes Ereignis Folgendes anzuzeigen:
"Loaded: [event_name] - [complete_time_object]" - Die zweite Eingabe durch Aufteilen an Kommas zu verarbeiten, um die Anzeigeoptionen zu erhalten
- Jede Anzeigeoption zu verarbeiten:
- Für
"chronological":"=== CHRONOLOGICAL ORDER ==="anzeigen, gefolgt von den nach Datum sortierten Ereignissen (frühestes zuerst), im Format"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - Für
"details":"=== DETAILED INFORMATION ==="anzeigen, gefolgt von den folgenden Zeilen für jedes Ereignis (die letzten vier sind um zwei Leerzeichen eingerückt):Event: [event_name] Date: [year]-[month]-[day] Time: [hour]:[minute] UTC Weekday: [weekday_name] Unix timestamp: [unix_seconds] - Für
"summary":"=== TIMELINE SUMMARY ==="anzeigen, 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":"=== EVENTS BY DECADE ==="anzeigen, gefolgt von nach Jahrzehnten gruppierten Ereignissen im Format"[decade]s: [comma_separated_event_names]" - Die Abschlussmeldung anzeigen:
"Historical timeline processing completed"
Formatierungsregeln: Die Zeile Loaded: gibt den Wert von time.Time unverändert mit %v aus, zum Beispiel Loaded: Moon Landing - 1969-07-20 20:17:00 +0000 UTC. Alle anderen Datums- und Zeitangaben werden von Hand erstellt: Monat, Tag und Stunde haben keine führende Null, und die Minute hat immer zwei Stellen (%02d); dasselbe Ereignis wird also als Moon Landing: 1969-7-20 at 20:17 UTC ausgegeben, und Minute 0 wird als 21:00 ausgegeben. [unix_seconds] ist Unix() und ist für Daten vor 1970 negativ. In der Jahrzehnteliste sind die Jahrzehnte vom frühesten zum spätesten sortiert, und die Namen innerhalb jedes Jahrzehnts werden in Eingabereihenfolge durch ein Komma ohne Leerzeichen verbunden.
Verwende das Paket time, um mit time.Date bestimmte Daten zu erstellen, das Paket strings, um Eingabezeichenfolgen aufzuteilen, das Paket strconv, um Zahlenzeichenfolgen in Ganzzahlen umzuwandeln, und das Paket fmt für die formatierte Ausgabe. Denk daran, dass time.Date die Parameter in genau dieser Reihenfolge erwartet: Jahr, Monat, Tag, Stunde, Minute, Sekunde, Nanosekunde, Ort. Um chronologisch zu sortieren, kannst du time.Time-Objekte mit der Methode Before() vergleichen. Diese Herausforderung zeigt, wie man bestimmte Zeitpunkte erstellt und mit Go-Zeitfunktionen historische Daten verarbeitet.
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()
// Ereignisse aus der Eingabe parsen
eventEntries := strings.Split(eventsInput, ",")
// Anzeigeoptionen aus der Eingabe parsen
displayOptions := strings.Split(optionsInput, ",")
// TODO: Schreibe deinen Code unten
// 1. Jeden Ereigniseintrag parsen, um Name, Jahr, Monat, Tag, Stunde und Minute zu extrahieren
// 2. Vor dem Zugriff prüfen, ob das Slice parts genügend Elemente enthält
// 3. Zahlen aus Zeichenketten mit strconv.Atoi() in Ganzzahlen umwandeln
// 4. Für jedes Ereignis time.Time-Objekte mit time.Date() erstellen
// 5. Anwendungsüberschrift und Lademeldungen anzeigen
// 6. Jede Anzeigeoption verarbeiten (chronologisch, Details, Zusammenfassung, Jahre)
// 7. 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Übe selbstständig: Online-Go-Compiler