Trabajo con fechas y horas en Go: desde lo básico hasta técnicas avanzadas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción al trabajo con fechas y horas en Go

Trabajar con fechas y horas es una de las tareas clave en cualquier aplicación seria. Ya sea para registro de eventos, cálculo de tiempos de espera, trabajo con horarios o análisis de series temporales, el lenguaje Go proporciona un conjunto de herramientas potente y elegante en el paquete estándar time. En este artículo, analizaremos el trabajo con fechas y horas en Go de la A a la Z: desde la creación de objetos de tiempo hasta operaciones complejas con zonas horarias y temporizadores.



Fundamentos: la estructura time.Time y creación de fechas

El elemento central del paquete time es la estructura time.Time. Representa un momento en el tiempo con precisión de nanosegundos e información sobre la zona horaria.



Obtener la hora actual

El escenario más común es obtener el momento actual:

package main

import ( "fmt" "time")

func main() { now := time.Now() fmt.Println("Hora actual:", now)}


Crear una fecha específica

Para crear una fecha se utiliza la función time.Date(). Tenga en cuenta: en Go los meses se especifican mediante constantes (time.January, time.February, etc.) o un número del 1 al 12.

func main() {    // 15 de marzo de 2025, 14:30:00, UTC    specificDate := time.Date(2025, time.March, 15, 14, 30, 0, 0, time.UTC)    fmt.Println("Fecha específica:", specificDate)        // Creación con nanosegundos    preciseDate := time.Date(2025, 3, 15, 14, 30, 0, 123456789, time.UTC)    fmt.Println("Fecha precisa:", preciseDate)}


Formateo y análisis de fechas

En Go se utiliza un enfoque único para el formateo: en lugar de códigos como %Y-%m-%d, se usa la hora de referencia Mon Jan 2 15:04:05 MST 2006 (que se lee como 01 02 03 04 05 06 07 — año, mes, día, hora, minuto, segundo, año).



Formateo (time → cadena)

El método Format() convierte la hora en una cadena según la plantilla dada:

func main() {    now := time.Now()        // Formatos estándar    fmt.Println("RFC3339:", now.Format(time.RFC3339))    fmt.Println("Fecha:", now.Format("2006-01-02"))    fmt.Println("Hora:", now.Format("15:04:05"))    fmt.Println("Formato completo:", now.Format("02.01.2006 15:04:05"))    fmt.Println("Con día de la semana:", now.Format("Mon, 02 Jan 2006"))}


Análisis (cadena → time.Time)

La función time.Parse() analiza una cadena en una estructura de tiempo. Es importante: la plantilla debe coincidir exactamente con el formato de la cadena de entrada.

func main() {    // Análisis con formato conocido    dateStr := "2025-03-15 14:30:00"    parsed, err := time.Parse("2006-01-02 15:04:05", dateStr)    if err != nil {        panic(err)    }    fmt.Println("Analizado:", parsed)        // Análisis con zona horaria    dateWithZone := "2025-03-15T14:30:00+03:00"    parsedWithZone, _ := time.Parse(time.RFC3339, dateWithZone)    fmt.Println("Con zona horaria:", parsedWithZone)}


Aritmética de tiempo: intervalos y comparaciones

El paquete time proporciona el tipo Duration para representar intervalos de tiempo y métodos para operaciones aritméticas.



Suma y resta

func main() {    now := time.Now()        // Añadir 2 horas 30 minutos    future := now.Add(2*time.Hour + 30*time.Minute)    fmt.Println("En 2.5 horas:", future)        // Restar 7 días    past := now.Add(-7 * 24 * time.Hour)    fmt.Println("Hace una semana:", past)        // Usar AddDate para trabajar con fechas de calendario    nextMonth := now.AddDate(0, 1, 0)    fmt.Println("En un mes:", nextMonth)}


Calcular la diferencia entre fechas

El método Sub() devuelve un Duration:

func main() {    start := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC)    end                

Blogs

Book Recommendations