Trabajo con fechas en Go (Golang): bibliotecas y herramientas
El lenguaje Go (Golang) ofrece una potente biblioteca estándar time que cubre la mayoría de las tareas relacionadas con fechas y horas. Sin embargo, para operaciones complejas como el análisis de formatos no estándar, trabajo con fechas relativas o cálculos con calendarios comerciales, la comunidad ha creado una serie de bibliotecas útiles. En este artículo, analizaremos tanto las capacidades integradas de Go como los mejores paquetes de terceros para trabajar con fechas.
1. Biblioteca integrada time
La biblioteca estándar time es la base para cualquier operación con fechas en Go. Proporciona:
- Tipos
Time,Duration,Location - Funciones para obtener la hora actual, crear fechas, analizar y formatear
- Soporte para zonas horarias y relojes monotónicos
Obtener la hora actual
package main
import ( "fmt" "time")
func main() { now := time.Now() fmt.Println("Hora actual:", now) fmt.Println("Año:", now.Year()) fmt.Println("Mes:", now.Month()) fmt.Println("Día:", now.Day())}Formateo de fechas
En Go se utiliza un formato de referencia especial: Mon Jan 2 15:04:05 MST 2006 (1,2,3,4,5,6 — dígitos en orden ascendente).
now := time.Now()fmt.Println(now.Format("2006-01-02 15:04:05")) // 2025-03-15 14:30:00fmt.Println(now.Format("02 Jan 2006")) // 15 Mar 2025fmt.Println(now.Format(time.RFC3339)) // 2025-03-15T14:30:00ZAnálisis de cadenas
dateStr := "2025-03-15 14:30:00"t, err := time.Parse("2006-01-02 15:04:05", dateStr)if err != nil { panic(err)}fmt.Println(t) // 2025-03-15 14:30:00 +0000 UTCTrabajo con zonas horarias
loc, _ := time.LoadLocation("Europe/Moscow")moscowTime := time.Now().In(loc)fmt.Println("Hora de Moscú:", moscowTime.Format("15:04:05"))2. Biblioteca carbon
El paquete github.com/golang-module/carbon es el equivalente en Go de la popular biblioteca Carbon de PHP. Proporciona una API conveniente para trabajar con fechas, incluyendo fechas relativas, formatos legibles por humanos y llamadas encadenadas.
Instalación
go get github.com/golang-module/carbon/v2Ejemplos de uso
package main
import ( "fmt" "github.com/golang-module/carbon/v2")
func main() { // Fecha actual now := carbon.Now() fmt.Println(now.ToDateString()) // 2025-03-15
// Fechas relativas fmt.Println(now.AddDays(7).ToDateString()) // 2025-03-22 fmt.Println(now.SubMonths(1).ToDateString()) // 2025-02-15 fmt.Println(now.StartOfMonth().ToDateString()) // 2025-03-01 fmt.Println(now.EndOfMonth().ToDateString()) // 2025-03-31
// Formatos legibles por humanos fmt.Println(now.DiffForHumans()) // 刚刚 (justo ahora)
// Análisis con soporte de múltiples formatos t := carbon.Parse("2025-03-15 14:30:00") fmt.Println(t.ToDateTimeString()) // 2025-03-15 14:30:00
// Trabajo con zonas horarias cst := carbon.Now(carbon.NewYork) fmt.Println(cst.ToDateTimeString()) // hora en Nueva York}3. Biblioteca now
El paquete github.com/jinzhu/now (del autor de GORM) proporciona funciones convenientes para obtener el inicio y el final de períodos de tiempo.
Instalación
go get github.com/jinzhu/nowEjemplos
package main
import ( "fmt" "github.com/jinzhu/now" "time")
func main() { t := time.Now() fmt.Println(now.BeginningOfMonth(t)) // 2025-03-01 00:00:00 fmt.Println(now.EndOfMonth(t)) // 2025-03-31 23:59:59 fmt.Println(now.BeginningOfYear(t))