Menu
CoddyTech

Crear una hora específica

Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 59 de 68.

Mientras que time.Now() te da el momento actual, a menudo necesitarás trabajar con fechas y horas específicas. Go proporciona la función time.Date para crear un objeto time.Time que represente cualquier fecha y hora que especifiques.

La función time.Date recibe ocho parámetros en este orden exacto: año, mes, día, hora, minuto, segundo, nanosegundo y ubicación. Esta es la sintaxis básica:

birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)

Observa que Go usa constantes como time.March para los meses, lo que hace que tu código sea más legible que si usaras números. También puedes usar números enteros (1-12) si lo prefieres. El parámetro de ubicación suele usar time.UTC para la hora UTC o time.Local para la zona horaria local de tu sistema.

Este enfoque te da control total para crear cualquier momento específico en el tiempo, ya sea un cumpleaños, una fecha límite o una fecha histórica. El objeto time.Time resultante funciona exactamente igual que el de time.Now() y se puede usar con las mismas operaciones de tiempo.

challenge icon

Desafío

Fácil

Crea una aplicación de línea de tiempo de eventos históricos que use time.Date para representar fechas y horas específicas de la historia. Este desafío pondrá a prueba tu capacidad para crear objetos time.Time que representen momentos históricos precisos y mostrarlos en un formato organizado.

Recibirás dos entradas:

  • Una cadena que contiene eventos históricos con el formato "event1:year:month:day:hour:minute,event2:year:month:day:hour:minute" (por ejemplo, "Moon Landing:1969:7:20:20:17,Berlin Wall Fall:1989:11:9:21:0")
  • Una cadena que contiene opciones de visualización separadas por comas con el formato "option1,option2,option3" (por ejemplo, "chronological,details,summary")

Tu tarea es:

  1. Analizar la primera entrada separándola por comas para obtener las entradas de cada evento
  2. Para cada entrada de evento, separarla por dos puntos para extraer el nombre del evento, el año, el mes, el día, la hora y el minuto
  3. Convertir las cadenas numéricas en enteros y crear un objeto time.Time con time.Date para cada evento (usa time.UTC como parámetro de ubicación y 0 para los segundos y los nanosegundos)
  4. Mostrar el encabezado de la aplicación: "=== HISTORICAL TIMELINE APPLICATION ==="
  5. Mostrar la confirmación de carga de eventos: "Loading historical events..."
  6. Para cada evento, mostrar: "Loaded: [event_name] - [complete_time_object]"
  7. Analizar la segunda entrada separándola por comas para obtener las opciones de visualización
  8. Procesar cada opción de visualización:
    • Para "chronological": Mostrar "=== CHRONOLOGICAL ORDER ===" seguido de los eventos ordenados por fecha (del más antiguo al más reciente), mostrando "[event_name]: [year]-[month]-[day] at [hour]:[minute] UTC"
    • Para "details": Mostrar "=== DETAILED INFORMATION ===" seguido de estas líneas para cada evento (las últimas cuatro llevan una sangría de dos espacios):
      Event: [event_name]
        Date: [year]-[month]-[day]
        Time: [hour]:[minute] UTC
        Weekday: [weekday_name]
        Unix timestamp: [unix_seconds]
    • Para "summary": Mostrar "=== TIMELINE SUMMARY ===" seguido de:
      • "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"
    • Para "years": Mostrar "=== EVENTS BY DECADE ===" seguido de los eventos agrupados por década, mostrando "[decade]s: [comma_separated_event_names]"
  9. Mostrar el mensaje de finalización: "Historical timeline processing completed"

Reglas de formato: la línea Loaded: imprime el valor time.Time tal como está con %v, por ejemplo, Loaded: Moon Landing - 1969-07-20 20:17:00 +0000 UTC. Todas las demás fechas y horas se construyen manualmente: el mes, el día y la hora no llevan cero inicial, y el minuto siempre tiene dos dígitos (%02d), por lo que el mismo evento se imprime como Moon Landing: 1969-7-20 at 20:17 UTC, y el minuto 0 se imprime como 21:00. [unix_seconds] es Unix(), que es negativo para las fechas anteriores a 1970. En la lista de décadas, estas aparecen de la más antigua a la más reciente, y los nombres de cada década se unen con una coma y sin espacios, en el orden de entrada.

Usa el paquete time para crear fechas específicas con time.Date, el paquete strings para separar las cadenas de entrada, el paquete strconv para convertir cadenas numéricas en enteros y el paquete fmt para generar resultados con formato. Recuerda que time.Date recibe los parámetros en este orden exacto: año, mes, día, hora, minuto, segundo, nanosegundo, ubicación. Para ordenar cronológicamente, puedes comparar objetos time.Time con el método Before(). Este desafío demuestra cómo crear momentos específicos y trabajar con datos históricos usando las funcionalidades de tiempo de Go.

Pruébalo tú mismo

package main

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

func main() {
	// Lee la entrada usando bufio.Scanner para manejar correctamente los espacios
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	eventsInput := scanner.Text()
	
	scanner.Scan()
	optionsInput := scanner.Text()
	
	// Analiza los eventos de la entrada
	eventEntries := strings.Split(eventsInput, ",")
	
	// Analiza las opciones de visualización de la entrada
	displayOptions := strings.Split(optionsInput, ",")
	
	// TODO: Escribe tu código a continuación
	// 1. Analiza cada entrada de evento para extraer el nombre, el año, el mes, el día, la hora y el minuto
	// 2. Recuerda comprobar que el slice parts tenga suficientes elementos antes de acceder a ellos
	// 3. Convierte los números de cadenas de texto a enteros usando strconv.Atoi()
	// 4. Crea objetos time.Time usando time.Date() para cada evento
	// 5. Muestra el encabezado de la aplicación y los mensajes de carga
	// 6. Procesa cada opción de visualización (chronological, details, summary, years)
	// 7. Muestra el mensaje de finalización
	
}
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

Practica por tu cuenta: Compilador de Go online