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.
Desafío
FácilCrea 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:
- Analizar la primera entrada separándola por comas para obtener las entradas de cada evento
- 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
- Convertir las cadenas numéricas en enteros y crear un objeto
time.Timecontime.Datepara cada evento (usatime.UTCcomo parámetro de ubicación y 0 para los segundos y los nanosegundos) - Mostrar el encabezado de la aplicación:
"=== HISTORICAL TIMELINE APPLICATION ===" - Mostrar la confirmación de carga de eventos:
"Loading historical events..." - Para cada evento, mostrar:
"Loaded: [event_name] - [complete_time_object]" - Analizar la segunda entrada separándola por comas para obtener las opciones de visualización
- 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]" - 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
}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 comportamientosPractica por tu cuenta: Compilador de Go online