Trabajo con fechas y horas en Go: desde lo básico hasta técnicas avanzadas
El lenguaje de programación Go (Golang) ofrece un paquete time potente e intuitivo para trabajar con fechas y horas. A diferencia de muchos otros lenguajes, Go utiliza un enfoque único para el formateo, basado en una fecha de referencia (Mon Jan 2 15:04:05 MST 2006). En este artículo, analizaremos en detalle todos los aspectos clave: desde la creación de objetos de tiempo hasta el trabajo con temporizadores y zonas horarias. El material será útil tanto para principiantes como para desarrolladores experimentados que migran a Go.
1. Fundamentos: creación, obtención y visualización de la hora
El tipo central para trabajar es time.Time. El momento actual se obtiene con time.Now(). Para crear una fecha específica se utiliza time.Date().
package main
import ( "fmt" "time")
func main() { // Hora actual now := time.Now() fmt.Println("Ahora:", now)
// Creación de una fecha específica (año, mes, día, hora, min, seg, nanoseg, Location) specific := time.Date(2025, time.January, 15, 10, 30, 0, 0, time.UTC) fmt.Println("Fecha específica:", specific)
// Extracción de componentes fmt.Println("Año:", now.Year()) fmt.Println("Mes:", now.Month()) fmt.Println("Día:", now.Day()) fmt.Println("Hora:", now.Hour()) fmt.Println("Minuto:", now.Minute()) fmt.Println("Segundo:", now.Second()) fmt.Println("Día de la semana:", now.Weekday())}La salida del programa mostrará la hora actual y sus componentes. Tenga en cuenta: time.Now() devuelve la hora en la zona horaria local del sistema.
2. Formateo y análisis: característica distintiva de Go
En Go, el formateo de fechas no se realiza mediante caracteres como YYYY-MM-DD, sino a través de una fecha de referencia: Mon Jan 2 15:04:05 MST 2006 (o 01/02 03:04:05PM '06 -0700). Recuerde esta cadena mágica: se ve como 1 2 3 4 5 6 -7.
- 1 — mes (01, Jan, January)
- 2 — día (02, 2)
- 3 — hora en formato de 12 horas (03, 3)
- 4 — minuto (04, 4)
- 5 — segundo (05, 5)
- 6 — año (06, 2006)
- -7 — zona horaria (MST, -0700, -07:00)
Formateo (Time → String)
now := time.Now()
// Formatos estándarfmt.Println(now.Format("2006-01-02 15:04:05")) // 2025-01-15 10:30:45fmt.Println(now.Format("02.01.2006")) // 15.01.2025fmt.Println(now.Format(time.RFC3339)) // 2025-01-15T10:30:45Zfmt.Println(now.Format("Mon, 02 Jan 2006 15:04:05 MST")) // Wed, 15 Jan 2025 10:30:45 UTCAnálisis (String → Time)
// Análisis de cadena a time.TimedateStr := "2025-01-15 10:30:45"layout := "2006-01-02 15:04:05"parsedTime, err := time.Parse(layout, dateStr)if err != nil { panic(err)}fmt.Println("Analizado:", parsedTime)
// Análisis con zona horariadateWithZone := "2025-01-15T10:30:45+03:00"parsedWithZone, _ := time.Parse(time.RFC3339, dateWithZone)fmt.Println("Con zona:", parsedWithZone)Si necesita analizar una fecha en una zona horaria específica, use time.ParseInLocation().
3. Operaciones con fechas: Duration, Add, Sub y comparación
El tipo time.Duration representa un intervalo de tiempo. Go proporciona constantes: Nanosecond, Microsecond, Millisecond, Second, Minute, Hour.
now := time.Now()
// Adición de tiempofuture := now.Add(72 * time.Hour) // +3 díasfmt.Println("Dentro de 72 horas:", future)
// Sustracción de tiempopast := now.Add(-30 * time.Minute) // 30 minutos atrásfmt.P