Menu
Coddy logo textTech

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 2h0m0s

Questi 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.

challenge icon

Sfida

Facile

Crea 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 è:

  1. Analizzare il primo input separandolo in corrispondenza dei due punti per estrarre i valori di anno, mese, giorno, ora e minuto
  2. Convertire questi valori stringa in numeri interi e creare un orario di inizio del progetto usando time.Date (usa time.UTC come località, 0 per i secondi e i nanosecondi)
  3. Analizzare il secondo input separandolo in corrispondenza delle virgole per ottenere le singole voci delle attività
  4. 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
  5. Convertire i valori delle durate in numeri interi e creare oggetti time.Duration usando le costanti appropriate:
    • Per "Day": moltiplicare per 24 * time.Hour
    • Per "Week": moltiplicare per 7 * 24 * time.Hour
    • Per "Hour": moltiplicare per time.Hour
  6. Visualizzare l’intestazione dell’applicazione: "=== PROJECT DEADLINE CALCULATOR ==="
  7. Visualizzare l’inizio del progetto: "Project start time: [start_time_object]"
  8. 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):
  9. Per ogni attività, visualizzare:
    • "Task: [task_name]"
    • " Duration: [duration_object]"
    • " Start: [task_start_time]"
    • " End: [task_end_time]" (calcolato usando il metodo Add)
  10. 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 metodo Sub tra la fine e l’inizio del progetto)
  11. 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])"
  12. 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)
  13. 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"
  14. 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
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Go online