Creare un orario specifico
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 59 di 68.
Anche se time.Now() ti fornisce il momento attuale, spesso dovrai lavorare con date e orari specifici. Go mette a disposizione la funzione time.Date per creare un oggetto time.Time che rappresenta qualsiasi data e ora tu specifichi.
La funzione time.Date accetta otto parametri in questo preciso ordine: anno, mese, giorno, ora, minuto, secondo, nanosecondo e località. Ecco la sintassi di base:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)Nota che Go utilizza costanti come time.March per i mesi, rendendo il codice più leggibile rispetto all’uso dei numeri. Se preferisci, puoi usare anche numeri interi (1-12). Il parametro location di solito utilizza time.UTC per l’ora UTC o time.Local per il fuso orario locale del tuo sistema.
Questo approccio ti dà il pieno controllo sulla creazione di qualsiasi momento specifico nel tempo, che si tratti di un compleanno, una scadenza o una data storica. L’oggetto time.Time risultante funziona esattamente come quello ottenuto da time.Now() e può essere usato con tutte le stesse operazioni sul tempo.
Sfida
FacileCrea un'applicazione per la cronologia degli eventi storici che utilizza time.Date per rappresentare date e orari specifici della storia. Questa sfida metterà alla prova la tua capacità di creare oggetti time.Time per momenti storici precisi e visualizzarli in un formato organizzato.
Riceverai due input:
- Una stringa contenente eventi storici nel formato
"event1:year:month:day:hour:minute,event2:year:month:day:hour:minute"(ad esempio,"Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0") - Una stringa contenente opzioni di visualizzazione separate da virgole nel formato
"option1,option2,option3"(ad esempio,"chronological,details,summary")
Il tuo compito è:
- Analizzare il primo input dividendolo in corrispondenza delle virgole per ottenere le singole voci degli eventi
- Per ogni voce di evento, dividerla in corrispondenza dei due punti per estrarre il nome dell'evento, l'anno, il mese, il giorno, l'ora e il minuto
- Convertire le stringhe numeriche in interi e creare un oggetto
time.Timeusandotime.Dateper ogni evento (usatime.UTCcome parametro della località e 0 per i secondi e i nanosecondi) - Visualizzare l'intestazione dell'applicazione:
"=== HISTORICAL TIMELINE APPLICATION ===" - Visualizzare la conferma del caricamento degli eventi:
"Loading historical events..." - Per ogni evento, visualizzare:
"Loaded: [event_name] - [complete_time_object]" - Analizzare il secondo input dividendolo in corrispondenza delle virgole per ottenere le opzioni di visualizzazione
- Elaborare ogni opzione di visualizzazione:
- Per
"chronological": Visualizzare"=== CHRONOLOGICAL ORDER ==="seguito dagli eventi ordinati per data (dal più lontano nel passato al più recente), mostrando"[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC" - Per
"details": Visualizzare"=== DETAILED INFORMATION ==="seguito da ciascun evento, mostrando:"Event: [event_name]"" Date: [year]-[month]-[day]"" Time: [hour]:[minute] UTC"" Weekday: [weekday_name]"" Unix timestamp: [unix_seconds]"
- Per
"summary": Visualizzare"=== TIMELINE SUMMARY ==="seguito da:"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"
- Per
"years": Visualizzare"=== EVENTS BY DECADE ==="seguito dagli eventi raggruppati per decennio, mostrando"[decade]s: [comma_separated_event_names]" - Visualizzare il messaggio di completamento:
"Historical timeline processing completed"
Usa il pacchetto time per creare date specifiche con time.Date, il pacchetto strings per dividere le stringhe di input, il pacchetto strconv per convertire le stringhe numeriche in interi e il pacchetto fmt per l'output formattato. Ricorda che time.Date accetta i parametri esattamente in questo ordine: anno, mese, giorno, ora, minuto, secondo, nanosecondo, località. Per ordinare cronologicamente, puoi confrontare gli oggetti time.Time usando il metodo Before(). Questa sfida mostra come creare momenti specifici nel tempo e lavorare con dati storici usando le funzionalità temporali di Go.
Provalo tu
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Leggi l'input usando bufio.Scanner per gestire correttamente gli spazi
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
eventsInput := scanner.Text()
scanner.Scan()
optionsInput := scanner.Text()
// Analizza gli eventi dall'input
eventEntries := strings.Split(eventsInput, ",")
// Analizza le opzioni di visualizzazione dall'input
displayOptions := strings.Split(optionsInput, ",")
// TODO: Scrivi il tuo codice qui sotto
// 1. Analizza ogni voce degli eventi per estrarre nome, anno, mese, giorno, ora e minuto
// 2. Ricorda di verificare che lo slice parts contenga abbastanza elementi prima di accedervi
// 3. Converti i numeri rappresentati come stringhe in interi usando strconv.Atoi()
// 4. Crea oggetti time.Time usando time.Date() per ogni evento
// 5. Visualizza l'intestazione dell'applicazione e i messaggi di caricamento
// 6. Elabora ogni opzione di visualizzazione (cronologica, dettagli, riepilogo, anni)
// 7. Visualizza il messaggio di completamento
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Flusso di controllo avanzato
Switch con `fallthrough`Uscire dai cicli annidatiContinuare un ciclo specificoL'istruzione `goto`Riepilogo - Controllo avanzato dei cicli4Progetto: semplice lista di attività
Configurazione del progettoAggiungere un’attività7Gestione degli errori in dettaglio
Tipi di errore personalizzatiAvvolgere gli errori con `%w`Rimuovere il wrapping con `errors.Is`Rimuovere il wrapping con `errors.As`Capire `panic`Usare `recover`Riepilogo - Divisione sicura10Lavorare con il tempo
Ottenere l'ora correnteCreare un orario specificoFormattare l'oraAnalizzare stringhe di tempoDurata temporaleOperazioni aritmetiche con il tempoSospensioni e tickerRiepilogo - Timer semplice2Struct e metodi
Definire metodi sugli structReceiver per valoreReceiver con puntatoreScegliere i receiverMetodi vs funzioniRiepilogo - comportamento degli struct5Mappe in dettaglio
Mappe di structPuntatori come valori delle mappeVerificare le mappe nilConfrontare le mappeRiepilogo - Contatore della frequenza delle parole3Interfacce (le basi)
Che cos’è un’interfaccia?Definire un’interfacciaImplementare un’interfacciaUsare i tipi interfacciaInterfaccia vuotaAsserzioni di tipoSwitch di tipoRiepilogo: forme e comportamentiEsercitati da solo: Compilatore Go online