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 un formato de cadena legible. Go utiliza un enfoque único para el formateo de tiempo que es diferente al de otros lenguajes de programación.
En lugar de usar códigos de formato como %Y-%m-%d, Go utiliza una fecha de referencia como plantilla. Esta fecha de referencia es Mon Jan 2 15:04:05 MST 2006, que representa el momento exacto: 2 de enero de 2006, a las 3:04:05 PM, hora estándar de la montaña (MST).
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // Salida: 2023-10-26La idea clave es que organizas los componentes de la fecha de referencia en el patrón que desees. Para un formato YYYY-MM-DD, usas "2006-01-02" porque así es como se ve la fecha de referencia en ese patrón. Para un formato diferente como Jan 2, 2006, usarías "Jan 2, 2006".
Este enfoque basado en diseños hace que el formateo de tiempo de Go sea tanto memorable como flexible. Una vez que recuerdas la fecha de referencia, puedes crear cualquier formato simplemente organizando sus componentes en el patrón deseado.
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 un sistema de visualización de fecha y hora multiformato que formatee objetos time.Time utilizando el sistema de diseño de fecha de referencia único de Go. Este desafío pondrá a prueba tu capacidad para usar el método Format con diferentes patrones de diseño para crear varias representaciones de fecha y hora.
Recibirás dos entradas:
- Una cadena que contiene información de la fecha en el formato
"year:month:day:hour:minute"(por ejemplo,"2023:12:25:14:30") - Una cadena que contiene solicitudes de formato separadas por comas en el formato
"format1,format2,format3"(por ejemplo,"iso,american,european,time12,time24")
Tu tarea es:
- Analizar la primera entrada dividiéndola por dos puntos para extraer los valores de año, mes, día, hora y minuto
- Convertir estos valores de cadena a enteros usando el paquete
strconv - Crear un objeto
time.Timeusandotime.Datecon los valores analizados (usatime.UTCpara la ubicación, 0 para segundos y nanosegundos) - Mostrar el encabezado de la aplicación:
"=== DATE/TIME FORMATTER ===" - Mostrar la hora de origen:
"Source time: [complete_time_object]" - Analizar la segunda entrada dividiéndola por comas para obtener las solicitudes de formato
- Mostrar el encabezado de formateo:
"Formatted outputs:" - Para cada solicitud de formato, utiliza la cadena de diseño adecuada con el método
Format:- Para
"iso": Usa el diseño"2006-01-02"y muestra"ISO format: [formatted_result]" - Para
"american": Usa el diseño"01/02/2006"y muestra"American format: [formatted_result]" - Para
"european": Usa el diseño"02/01/2006"y muestra"European format: [formatted_result]" - Para
"long": Usa el diseño"January 2, 2006"y muestra"Long format: [formatted_result]" - Para
"time12": Usa el diseño"3:04 PM"y muestra"12-hour time: [formatted_result]" - Para
"time24": Usa el diseño"15:04"y muestra"24-hour time: [formatted_result]" - Para
"full": Usa el diseño"Monday, January 2, 2006 at 3:04 PM"y muestra"Full format: [formatted_result]" - Para
"compact": Usa el diseño"20060102"y muestra"Compact format: [formatted_result]"
- Para
- Calcular y mostrar estadísticas:
"=== FORMATTING SUMMARY ===""Total formats applied: [number_of_format_requests]""Date components: [year]-[month]-[day]""Time components: [hour]:[minute]"
- 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"
- Mostrar el mensaje de finalización:
"Date formatting completed using Go's layout system"
Utiliza el paquete time para las operaciones de tiempo, el paquete strings para dividir las cadenas de entrada, el paquete strconv para convertir cadenas a enteros y el paquete fmt para la salida formateada. Recuerda que el formateo de tiempo de Go utiliza la fecha de referencia Mon Jan 2 15:04:05 MST 2006 como plantilla, y tú organizas estos componentes en el patrón que desees. Este desafío demuestra cómo funciona el sistema de formateo único basado en diseños de Go al hacerte aplicar múltiples patrones de formato diferentes al mismo objeto de tiempo.
Hoja de referencia
Go utiliza un enfoque de fecha de referencia único para el formateo de tiempo: Mon Jan 2 15:04:05 MST 2006
Para formatear un objeto time.Time, utiliza el método Format con patrones de diseño basados en la fecha de referencia:
now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // Salida: 2023-10-26Patrones de diseño comunes:
"2006-01-02"- Formato ISO (AAAA-MM-DD)"01/02/2006"- Formato americano (MM/DD/AAAA)"02/01/2006"- Formato europeo (DD/MM/AAAA)"January 2, 2006"- Formato largo"3:04 PM"- Hora en formato de 12 horas"15:04"- Hora en formato de 24 horas"Monday, January 2, 2006 at 3:04 PM"- Formato completo"20060102"- Formato compacto
La clave es organizar los componentes de la fecha de referencia en el patrón deseado.
Pruébalo tú mismo
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// Leer entrada
var dateInput string
var formatInput string
fmt.Scanln(&dateInput)
fmt.Scanln(&formatInput)
// Analizar los componentes de la fecha dividiendo por dos puntos
dateComponents := strings.Split(dateInput, ":")
// Convertir componentes de cadena a 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])
// Crear objeto time.Time
sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// Analizar solicitudes de formato
formatRequests := strings.Split(formatInput, ",")
// TODO: Escribe tu código a continuación
// Mostrar el encabezado de la aplicación
// Mostrar la hora de origen
// Procesar cada solicitud de formato y mostrar las salidas formateadas
// Calcular y mostrar estadísticas
// Mostrar información de referencia
// Mostrar 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