Menu
CoddyTech

Formatear el tiempo

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

Una vez que tengas un objeto time.Time, a menudo necesitarás convertirlo en una cadena con un formato legible. Go utiliza un enfoque único para dar formato a la hora, diferente del de otros lenguajes de programación.

En lugar de usar códigos de formato como %Y-%m-%d, Go usa una fecha de referencia como plantilla. Esta fecha de referencia es Mon Jan 2 15:04:05 MST 2006, que representa el momento exacto: el 2 de enero de 2006 a las 3:04:05 p. m., hora estándar de la montaña.

now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // Salida: 2023-10-26

La idea clave es organizar los componentes de la fecha de referencia según el patrón que quieras. Para un formato YYYY-MM-DD, usas "2006-01-02" porque así se ve la fecha de referencia con ese patrón. Para un formato distinto, como Jan 2, 2006, usarías "Jan 2, 2006".

Este enfoque basado en la disposición hace que el formato de hora de Go sea fácil de recordar y flexible. Una vez que recuerdes la fecha de referencia, puedes crear cualquier formato simplemente organizando sus componentes según el patrón que quieras.

challenge icon

Desafío

Fácil

Crea un sistema de visualización de fecha y hora en varios formatos que formatee objetos time.Time mediante el exclusivo sistema de diseños basado en una fecha de referencia de Go. Este desafío pondrá a prueba tu capacidad para usar el método Format con distintos patrones de diseño y crear varias representaciones de fecha y hora.

Recibirás dos entradas:

  • Una cadena que contiene información de fecha con el formato "year:month:day:hour:minute" (por ejemplo, "2023:12:25:14:30")
  • Una cadena que contiene solicitudes de formato separadas por comas, con el formato "format1,format2,format3" (por ejemplo, "iso,american,european,time12,time24")

Tu tarea es:

  1. Analizar la primera entrada separándola por los dos puntos para extraer los valores de año, mes, día, hora y minuto
  2. Convertir estos valores de cadena a enteros mediante el paquete strconv
  3. Crear un objeto time.Time usando time.Date con los valores analizados (usa time.UTC como ubicación, 0 para los segundos y los nanosegundos)
  4. Mostrar el encabezado de la aplicación: "=== DATE/TIME FORMATTER ==="
  5. Mostrar la hora de origen: "Source time: [complete_time_object]"
  6. Analizar la segunda entrada separándola por comas para obtener las solicitudes de formato
  7. Mostrar el encabezado del formato: "Formatted outputs:"
  8. Para cada solicitud de formato, usar la cadena de diseño correspondiente con el método Format:
    • Para "iso": usar el diseño "2006-01-02" y mostrar "ISO format: [formatted_result]"
    • Para "american": usar el diseño "01/02/2006" y mostrar "American format: [formatted_result]"
    • Para "european": usar el diseño "02/01/2006" y mostrar "European format: [formatted_result]"
    • Para "long": usar el diseño "January 2, 2006" y mostrar "Long format: [formatted_result]"
    • Para "time12": usar el diseño "3:04 PM" y mostrar "12-hour time: [formatted_result]"
    • Para "time24": usar el diseño "15:04" y mostrar "24-hour time: [formatted_result]"
    • Para "full": usar el diseño "Monday, January 2, 2006 at 3:04 PM" y mostrar "Full format: [formatted_result]"
    • Para "compact": usar el diseño "20060102" y mostrar "Compact format: [formatted_result]"
  9. Calcular y mostrar estadísticas:
    • "=== FORMATTING SUMMARY ==="
    • "Total formats applied: [number_of_format_requests]"
    • "Date components: [year]-[month]-[day]"
    • "Time components: [hour]:[minute]"
  10. Mostrar información de referencia:
    • "=== REFERENCE DATE INFO ==="
    • "Go uses reference date: Mon Jan 2 15:04:05 MST 2006"
    • "This represents: January 2nd, 2006 at 3:04:05 PM"
    • "Layout patterns arrange these components as needed"
  11. Mostrar el mensaje de finalización: "Date formatting completed using Go's layout system"

Usa el paquete time para las operaciones con fechas y horas, el paquete strings para dividir las cadenas de entrada, el paquete strconv para convertir cadenas a enteros y el paquete fmt para la salida con formato. Recuerda que el formato de hora de Go usa como plantilla la fecha de referencia Mon Jan 2 15:04:05 MST 2006, y que debes organizar estos componentes según el patrón que quieras. Este desafío muestra cómo funciona el exclusivo sistema de formato basado en diseños de Go, al pedirte que apliques varios patrones de formato distintos al mismo objeto de hora.

Pruébalo tú mismo

package main

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

func main() {
	// Lee la entrada
	var dateInput string
	var formatInput string
	fmt.Scanln(&dateInput)
	fmt.Scanln(&formatInput)
	
	// Analiza los componentes de la fecha separándolos por dos puntos
	dateComponents := strings.Split(dateInput, ":")
	
	// Convierte los componentes de texto en números enteros
	year, _ := strconv.Atoi(dateComponents[0])
	month, _ := strconv.Atoi(dateComponents[1])
	day, _ := strconv.Atoi(dateComponents[2])
	hour, _ := strconv.Atoi(dateComponents[3])
	minute, _ := strconv.Atoi(dateComponents[4])
	
	// Crea un objeto time.Time
	sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
	
	// Analiza las solicitudes de formato
	formatRequests := strings.Split(formatInput, ",")
	
	// TODO: Escribe tu código a continuación
	// Muestra el encabezado de la aplicación
	// Muestra la hora de origen
	// Procesa cada solicitud de formato y muestra los resultados formateados
	// Calcula y muestra las estadísticas
	// Muestra la información de referencia
	// 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