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 proporciona 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 representa cualquier fecha y hora que especifiques.
La función time.Date toma ocho parámetros en este orden exacto: año, mes, day, 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 utiliza constantes como time.March para los meses, lo que hace que tu código sea más legible que usar números. También puedes utilizar enteros (1-12) si lo prefieres. El parámetro de ubicación normalmente utiliza time.UTC para la hora UTC o time.Local para la zona horaria local de tu sistema.
Este enfoque te brinda 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 puede usarse con las mismas operaciones de tiempo.
Desafío
FácilCrea una aplicación de línea temporal 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 en 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 en el formato
"option1,option2,option3"(por ejemplo,"chronological,details,summary")
Tu tarea es:
- Analizar la primera entrada dividiéndola por comas para obtener las entradas de cada evento
- Para cada entrada de evento, dividirla 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.Timeusandotime.Datepara cada evento (usatime.UTCcomo parámetro de ubicación y 0 para los segundos y nanosegundos) - Mostrar el encabezado de la aplicación:
"=== HISTORICAL TIMELINE APPLICATION ===" - Mostrar la confirmación de carga de los eventos:
"Loading historical events..." - Para cada evento, mostrar:
"Loaded: [event_name] - [complete_time_object]" - Analizar la segunda entrada dividié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 cada evento mostrando:"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"
Usa el paquete time para crear fechas específicas con time.Date, el paquete strings para dividir las cadenas de entrada, el paquete strconv para convertir cadenas numéricas en enteros y el paquete fmt para la salida con formato. Recuerda que time.Date recibe los parámetros en el orden exacto: año, mes, día, hora, minuto, segundo, nanosegundo y ubicación. Para ordenar cronológicamente, puedes comparar objetos time.Time usando el método Before(). Este desafío demuestra cómo crear momentos específicos en el tiempo y trabajar con datos históricos usando la funcionalidad temporal de Go.
Pruébalo tú mismo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
)
func main() {
// Leer la entrada usando bufio.Scanner para manejar los espacios correctamente
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
eventsInput := scanner.Text()
scanner.Scan()
optionsInput := scanner.Text()
// Analizar los eventos de la entrada
eventEntries := strings.Split(eventsInput, ",")
// Analizar 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 name, year, month, day, hour, minute
// 2. Recuerda comprobar si el slice parts tiene suficientes elementos antes de acceder
// 3. Convierte los números en string 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. Process each display option (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