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 2h0m0sEstos 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.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilCrea 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:
- Analizar la primera entrada dividiéndola por dos puntos para extraer los valores de año, mes, día, hora y minuto
- Convertir estos valores de cadena a enteros y crear una hora de inicio del proyecto usando
time.Date(usatime.UTCpara la ubicación, 0 para segundos y nanosegundos) - Analizar la segunda entrada dividiéndola por comas para obtener las entradas de tareas individuales
- 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
- Convertir los valores de duración a enteros y crear objetos
time.Durationusando las constantes apropiadas:- Para
"Day": multiplicar por24 * time.Hour - Para
"Week": multiplicar por7 * 24 * time.Hour - Para
"Hour": multiplicar portime.Hour
- Para
- Mostrar el encabezado de la aplicación:
"=== PROJECT DEADLINE CALCULATOR ===" - Mostrar el inicio del proyecto:
"Project start time: [start_time_object]" - 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):
- Para cada tarea, mostrar:
"Task: [task_name]"" Duration: [duration_object]"" Start: [task_start_time]"" End: [task_end_time]"(calculado usando el métodoAdd)
- 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étodoSubentre el final y el inicio del proyecto)
- 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])"
- 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)
- 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"
- 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 2h0m0sAmbos 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
}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
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea7Manejo de errores a fondo
Tipos de error personalizadosEnvolver errores con `%w`Desenvolver con `errors.Is`Desenvolver con `errors.As`Entendiendo `panic`Uso de `recover`Repaso - División segura10Trabajando con el tiempo
Obtener la hora actualCrear una hora específicaFormatear el tiempoParsing de cadenas de tiempoDuración del tiempoAritmética de tiempoSleeping y TickersResumen - Temporizador simple2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos