Operazioni aritmetiche con il tempo
Fa parte della sezione Logica e flusso del percorso GO di Coddy. Lezione 63 di 68.
Ora che hai compreso gli oggetti time.Time e i valori time.Duration, puoi eseguire operazioni aritmetiche per calcolare orari passati o futuri. Go fornisce due metodi essenziali per l'aritmetica temporale: Add e Sub.
Il metodo Add accetta un time.Duration e restituisce un nuovo time.Time che rappresenta l'ora originale più la durata:
now := time.Now()
tomorrow := now.Add(24 * time.Hour)
fmt.Println(tomorrow)Il metodo Sub funziona in due modi. Quando sottrai un time.Time da un altro, restituisce un time.Duration che rappresenta la differenza tra i due:
start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // Restituisce 2h0m0sQuesti metodi semplificano il calcolo delle scadenze, la misurazione del tempo trascorso o la pianificazione di eventi futuri. L’oggetto originale time.Time rimane invariato: entrambi i metodi restituiscono nuovi valori, in linea con la preferenza di Go per le operazioni immutabili.
Sfida
FacileCrea un calcolatore delle scadenze di progetto che utilizzi l’aritmetica del tempo per determinare le tappe e le scadenze del progetto. Questa sfida metterà alla prova la tua capacità di usare i metodi Add e Sub sugli oggetti time.Time per calcolare date future e differenze di tempo tra eventi.
Riceverai due input:
- Una stringa contenente le informazioni sull’inizio del progetto nel formato
"year:month:day:hour:minute"(ad es.,"2024:1:15:9:0") - Una stringa contenente le durate delle attività nel formato
"task1:duration_value:duration_unit,task2:duration_value:duration_unit"(ad es.,"Planning:5:Day,Development:3:Week,Testing:10:Day")
Il tuo compito è:
- Analizzare il primo input separandolo in corrispondenza dei due punti per estrarre i valori di anno, mese, giorno, ora e minuto
- Convertire questi valori stringa in numeri interi e creare un orario di inizio del progetto usando
time.Date(usatime.UTCcome località, 0 per i secondi e i nanosecondi) - Analizzare il secondo input separandolo in corrispondenza delle virgole per ottenere le singole voci delle attività
- Per ogni voce di attività, separarla in corrispondenza dei due punti per estrarre il nome dell’attività, il valore della durata e l’unità di durata
- Convertire i valori delle durate in numeri interi e creare oggetti
time.Durationusando le costanti appropriate:- Per
"Day": moltiplicare per24 * time.Hour - Per
"Week": moltiplicare per7 * 24 * time.Hour - Per
"Hour": moltiplicare pertime.Hour
- Per
- Visualizzare l’intestazione dell’applicazione:
"=== PROJECT DEADLINE CALCULATOR ===" - Visualizzare l’inizio del progetto:
"Project start time: [start_time_object]" - Calcolare le scadenze delle attività aggiungendo la durata di ciascuna attività all’ora di fine dell’attività precedente (la prima attività inizia all’ora di inizio del progetto):
- Per ogni attività, visualizzare:
"Task: [task_name]"" Duration: [duration_object]"" Start: [task_start_time]"" End: [task_end_time]"(calcolato usando il metodoAdd)
- Calcolare e visualizzare la cronologia del progetto:
"=== PROJECT TIMELINE ===""Project start: [start_time_object]""Project end: [final_task_end_time]""Total project duration: [total_duration_object]"(calcolata usando il metodoSubtra la fine e l’inizio del progetto)
- Visualizzare l’analisi delle attività:
"=== TASK ANALYSIS ===""Number of tasks: [number_of_tasks]""Longest task: [longest_task_name] ([longest_duration_object])""Shortest task: [shortest_task_name] ([shortest_duration_object])"
- Calcolare il tempo tra attività consecutive e visualizzare gli intervalli:
"=== TASK TRANSITIONS ==="- Per ogni coppia di attività consecutive:
"[first_task_name] to [second_task_name]: [time_difference_object]"(dovrebbe essere 0 poiché le attività sono consecutive)
- Visualizzare le statistiche del progetto:
"=== PROJECT STATISTICS ===""Total working days: [total_duration_in_hours_divided_by_24]""Total working hours: [total_duration_in_hours]""Project spans [number_of_calendar_days] calendar days"
- Visualizzare il messaggio di completamento:
"Project timeline calculation completed successfully"
Usa il pacchetto time per le operazioni temporali, il pacchetto strings per separare le stringhe di input, il pacchetto strconv per convertire le stringhe in numeri interi e il pacchetto fmt per l’output formattato. Ricorda che il metodo Add restituisce un nuovo oggetto time.Time che rappresenta l’ora originale più la durata, mentre il metodo Sub restituisce un time.Duration che rappresenta la differenza tra due orari. Questa sfida mostra come creare una cronologia completa del progetto usando operazioni aritmetiche sul tempo.
Provalo tu
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// Leggi l'input
var startInfo string
var taskInfo string
fmt.Scanln(&startInfo)
fmt.Scanln(&taskInfo)
// Analizza le informazioni sull'ora di inizio
startParts := strings.Split(startInfo, ":")
year, _ := strconv.Atoi(startParts[0])
month, _ := strconv.Atoi(startParts[1])
day, _ := strconv.Atoi(startParts[2])
hour, _ := strconv.Atoi(startParts[3])
minute, _ := strconv.Atoi(startParts[4])
// Crea l'istante di inizio del progetto
startTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// Analizza le informazioni sulle attività
taskEntries := strings.Split(taskInfo, ",")
// TODO: Scrivi il tuo codice qui sotto
// - Elabora ogni voce relativa a un'attività per estrarne il nome, il valore della durata e l'unità di misura
// - Crea oggetti che rappresentano la durata di ogni attività
// - Calcola gli orari di inizio e fine delle attività
// - Trova le attività più lunga e più breve
// - Calcola le statistiche del progetto
// - Visualizza tutte le sezioni di output richieste
// L'output verrà generato dal codice che hai scritto sopra
}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