Menu
Coddy logo textTech

Aritmética de tiempo

Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 63 de 68.

Ahora que entiendes los objetos time.Time y los valores time.Duration, puedes realizar operaciones aritméticas para calcular tiempos pasados o futuros. Go proporciona dos métodos esenciales para la aritmética de tiempo: Add y Sub.

El método Add toma un time.Duration y devuelve un nuevo time.Time que representa el tiempo original más la duración:

now := time.Now()
tomorrow := now.Add(24 * time.Hour)
fmt.Println(tomorrow)

El método Sub funciona de dos maneras. Cuando restas un time.Time de otro, devuelve un time.Duration que representa la diferencia entre ellos:

start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // Devuelve 2h0m0s

Estos métodos facilitan el cálculo de plazos, la medición del tiempo transcurrido o la programación de eventos futuros. El objeto time.Time original permanece sin cambios; ambos métodos devuelven nuevos valores, siguiendo la preferencia de Go por las operaciones inmutables.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

challenge icon

Desafío

Fácil

Crea una calculadora de plazos de proyectos que utilice aritmética de tiempo para determinar los hitos y plazos del proyecto. Este desafío pondrá a prueba tu capacidad para usar los métodos Add y Sub en objetos time.Time para calcular fechas futuras y diferencias de tiempo entre eventos.

Recibirás dos entradas:

  • Una cadena que contiene la información de inicio del proyecto en el formato "year:month:day:hour:minute" (por ejemplo, "2024:1:15:9:0")
  • Una cadena que contiene las duraciones de las tareas en el formato "task1:duration_value:duration_unit,task2:duration_value:duration_unit" (por ejemplo, "Planning:5:Day,Development:3:Week,Testing:10:Day")

Tu tarea es:

  1. Analizar la primera entrada dividiéndola por dos puntos para extraer los valores de año, mes, día, hora y minuto
  2. Convertir estos valores de cadena a enteros y crear una hora de inicio del proyecto usando time.Date (usa time.UTC para la ubicación, 0 para segundos y nanosegundos)
  3. Analizar la segunda entrada dividiéndola por comas para obtener las entradas de tareas individuales
  4. Para cada entrada de tarea, dividir por dos puntos para extraer el nombre de la tarea, el valor de la duración y la unidad de duración
  5. Convertir los valores de duración a enteros y crear objetos time.Duration usando las constantes apropiadas:
    • Para "Day": multiplicar por 24 * time.Hour
    • Para "Week": multiplicar por 7 * 24 * time.Hour
    • Para "Hour": multiplicar por time.Hour
  6. Mostrar el encabezado de la aplicación: "=== PROJECT DEADLINE CALCULATOR ==="
  7. Mostrar el inicio del proyecto: "Project start time: [start_time_object]"
  8. Calcular los plazos de las tareas sumando la duración de cada tarea a la hora de finalización de la tarea anterior (la primera tarea comienza a la hora de inicio del proyecto):
  9. Para cada tarea, mostrar:
    • "Task: [task_name]"
    • " Duration: [duration_object]"
    • " Start: [task_start_time]"
    • " End: [task_end_time]" (calculado usando el método Add)
  10. Calcular y mostrar la línea de tiempo del proyecto:
    • "=== PROJECT TIMELINE ==="
    • "Project start: [start_time_object]"
    • "Project end: [final_task_end_time]"
    • "Total project duration: [total_duration_object]" (calculado usando el método Sub entre el final y el inicio del proyecto)
  11. Mostrar el análisis de tareas:
    • "=== 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. Calcular el tiempo entre tareas consecutivas y mostrar los intervalos:
    • "=== TASK TRANSITIONS ==="
    • Para cada par de tareas consecutivas: "[first_task_name] to [second_task_name]: [time_difference_object]" (debería ser 0 ya que las tareas son consecutivas)
  13. Mostrar las estadísticas del proyecto:
    • "=== 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. Mostrar el mensaje de finalización: "Project timeline calculation completed successfully"

Utiliza el paquete time para las operaciones de tiempo, el paquete strings para dividir las cadenas de entrada, el paquete strconv para convertir cadenas a enteros y el paquete fmt para la salida formateada. Recuerda que el método Add devuelve un nuevo objeto time.Time que representa el tiempo original más la duración, y el método Sub devuelve un time.Duration que representa la diferencia entre dos tiempos. Este desafío demuestra cómo construir una línea de tiempo de proyecto completa utilizando operaciones aritméticas de tiempo.

Hoja de referencia

Go proporciona dos métodos esenciales para la aritmética de tiempo: Add y Sub.

El método Add toma un time.Duration y devuelve un nuevo time.Time:

now := time.Now()
tomorrow := now.Add(24 * time.Hour)

El método Sub resta un time.Time de otro y devuelve un time.Duration:

start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // Devuelve 2h0m0s

Ambos métodos devuelven nuevos valores sin modificar el objeto time.Time original.

Pruébalo tú mismo

package main

import (
	"fmt"
	"strconv"
	"strings"
	"time"
)

func main() {
	// Leer entrada
	var startInfo string
	var taskInfo string
	fmt.Scanln(&startInfo)
	fmt.Scanln(&taskInfo)
	
	// Analizar la información de la hora de inicio
	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])
	
	// Crear la hora de inicio del proyecto
	startTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
	
	// Analizar la información de las tareas
	taskEntries := strings.Split(taskInfo, ",")
	
	// TODO: Escribe tu código a continuación
	// - Procesar cada entrada de tarea para extraer el nombre, el valor de la duración y la unidad
	// - Crear objetos de duración para cada tarea
	// - Calcular las horas de inicio y fin de las tareas
	// - Encontrar las tareas más largas y más cortas
	// - Calcular las estadísticas del proyecto
	// - Mostrar todas las secciones de salida requeridas
	
	// La salida será generada por tu implementación anterior
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo