Trabalhando com datas em Go (Golang): bibliotecas e ferramentas
A linguagem Go (Golang) oferece uma poderosa biblioteca padrão time, que cobre a maioria das tarefas de trabalho com datas e horários. No entanto, para operações complexas, como parsing de formatos não padronizados, trabalho com datas relativas ou cálculos com calendários comerciais, a comunidade criou uma série de bibliotecas úteis. Neste artigo, veremos tanto os recursos nativos do Go quanto os melhores pacotes de terceiros para trabalhar com datas.
1. Biblioteca nativa time
A biblioteca padrão time é a base para qualquer operação com datas em Go. Ela fornece:
- Tipos
Time,Duration,Location - Funções para obter a hora atual, criar datas, fazer parsing e formatação
- Suporte a fusos horários e relógios monotônicos
Obtendo a hora atual
package main
import ( "fmt" "time")
func main() { now := time.Now() fmt.Println("Hora atual:", now) fmt.Println("Ano:", now.Year()) fmt.Println("Mês:", now.Month()) fmt.Println("Dia:", now.Day())}Formatação de datas
Em Go, é usado um formato de referência especial: Mon Jan 2 15:04:05 MST 2006 (1,2,3,4,5,6 — dígitos em ordem crescente).
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:00ZParsing de strings
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 UTCTrabalhando com fusos horários
loc, _ := time.LoadLocation("Europe/Moscow")moscowTime := time.Now().In(loc)fmt.Println("Horário de Moscou:", moscowTime.Format("15:04:05"))2. Biblioteca carbon
O pacote github.com/golang-module/carbon é um equivalente em Go da popular biblioteca PHP Carbon. Ele fornece uma API conveniente para trabalhar com datas, incluindo datas relativas, formatos legíveis por humanos e chamadas encadeadas.
Instalação
go get github.com/golang-module/carbon/v2Exemplos de uso
package main
import ( "fmt" "github.com/golang-module/carbon/v2")
func main() { // Data atual now := carbon.Now() fmt.Println(now.ToDateString()) // 2025-03-15
// Datas 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 legíveis por humanos fmt.Println(now.DiffForHumans()) // 刚刚 (agora mesmo)
// Parsing com suporte a múltiplos formatos t := carbon.Parse("2025-03-15 14:30:00") fmt.Println(t.ToDateTimeString()) // 2025-03-15 14:30:00
// Trabalhando com fusos horários cst := carbon.Now(carbon.NewYork) fmt.Println(cst.ToDateTimeString()) // horário em Nova York}3. Biblioteca now
O pacote github.com/jinzhu/now (do autor do GORM) fornece funções convenientes para obter o início e o fim de períodos de tempo.
Instalação
go get github.com/jinzhu/nowExemplos
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))