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