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 representa cualquier fecha y hora que especifiques.
La función time.Date toma siete parámetros en este orden exacto: año, mes, día, hora, minuto, segundo, nanosegundo y ubicación. Aquí está 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 usar números enteros (1-12) si lo prefieres. El parámetro de ubicación suele utilizar time.UTC para la hora UTC o time.Local para la zona horaria local de tu sistema.
Este enfoque te brinda un control total sobre la creación de 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 utilizar con todas las mismas operaciones de tiempo.
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 aplicación de línea de tiempo de eventos históricos que utilice 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 para 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 eventos individuales
- Para cada entrada de evento, dividir por dos puntos para extraer el nombre del evento, año, mes, día, hora y minuto
- Convertir las cadenas numéricas a enteros y crear un objeto
time.Timeusandotime.Datepara cada evento (usatime.UTCpara el parámetro de ubicación y 0 para segundos y 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 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 (el más antiguo primero), 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 números de cadena a enteros y el paquete fmt para la salida formateada. Recuerda que time.Date toma los parámetros en el orden exacto: año, mes, día, hora, minuto, segundo, nanosegundo, 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 utilizando la funcionalidad de tiempo de Go.
Hoja de referencia
Usa time.Date para crear un objeto time.Time para una fecha y hora específicas:
birthday := time.Date(1990, time.March, 15, 14, 30, 0, 0, time.UTC)La función time.Date toma siete parámetros en el orden exacto:
- año (int)
- mes (time.Month o int 1-12)
- día (int)
- hora (int)
- minuto (int)
- segundo (int)
- nanosegundo (int)
- ubicación (*time.Location)
Usa constantes de mes como time.March para mayor legibilidad, o enteros (1-12). Las ubicaciones comunes son time.UTC y time.Local.
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. Analizar cada entrada de evento para extraer nombre, año, mes, día, hora, minuto
// 2. Recuerda verificar si el slice de partes tiene suficientes elementos antes de acceder
// 3. Convertir los números de cadena a enteros usando strconv.Atoi()
// 4. Crear objetos time.Time usando time.Date() para cada evento
// 5. Mostrar el encabezado de la aplicación y los mensajes de carga
// 6. Procesar cada opción de visualización (cronológico, detalles, resumen, años)
// 7. Mostrar 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 comportamientos