Trabalho com datas em Go (Golang): visão geral das bibliotecas
Trabalhar com datas e horas é uma das tarefas principais em qualquer linguagem de programação. Em Go (Golang), a biblioteca padrão fornece um pacote poderoso time, mas às vezes, por conveniência, os desenvolvedores recorrem a bibliotecas de terceiros. Neste artigo, vamos explorar os principais recursos do pacote padrão e analisar duas bibliotecas populares: carbon e now.
1. Pacote padrão time
O pacote time é a base para trabalhar com datas em Go. Ele inclui os tipos Time, Duration, funções para parsing, formatação, trabalho com timers e fusos horários.
Criação e formatação de data
package main
import ( "fmt" "time")
func main() { // Hora atual now := time.Now() fmt.Println("Agora:", now)
// Criação de uma data específica date := time.Date(2025, time.March, 15, 14, 30, 0, 0, time.UTC) fmt.Println("Data específica:", date)
// Formatação (obrigatório "2006-01-02 15:04:05" como referência) fmt.Println("Formato:", date.Format("02.01.2006 15:04:05"))}Parsing de string para data
func main() { // Parsing com especificação do formato str := "2025-03-15 14:30:00" parsed, err := time.Parse("2006-01-02 15:04:05", str) if err != nil { panic(err) } fmt.Println("Parseado:", parsed)}Trabalho com fusos horários
func main() { loc, _ := time.LoadLocation("Europe/Moscow") moscowTime := time.Now().In(loc) fmt.Println("Horário de Moscou:", moscowTime)}Diferença entre datas
func main() { start := time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC) end := time.Date(2025, 12, 31, 23, 59, 59, 0, time.UTC) duration := end.Sub(start) fmt.Printf("Diferença: %v (horas: %v)", duration, duration.Hours())}2. Biblioteca carbon
A biblioteca carbon (github.com/golang-module/carbon) é um port da popular biblioteca PHP Carbon para Go. Ela fornece uma interface fluente conveniente para trabalhar com datas.
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("Agora:", now.ToString())
// Criação de data date := carbon.Parse("2025-03-15 14:30:00") fmt.Println("Parseado:", date.ToDateString())
// Adição de dias future := carbon.Now().AddDays(10) fmt.Println("Daqui a 10 dias:", future.ToDateString())
// Diferença em dias diff := carbon.Now().DiffInDays(carbon.Parse("2025-12-31")) fmt.Printf("Até o Ano Novo: %d dias", diff)
// Formatação fmt.Println("Formato personalizado:", carbon.Now().Format("d/m/Y H:i:s"))}Métodos úteis
StartOfDay()/EndOfDay()— início/fim do diaIsWeekend()/IsWeekday()— verificação do dia da semanaAge()— idade a partir da data de nascimentoDiffForHumans()— diferença legível para humanos (exemplo: "3 dias atrás")
3. Biblioteca now
A biblioteca now (github.com/jinzhu/now) do criador do GORM é uma utilidade leve para obter o início e o fim de períodos de tempo.
Instalação
go get github.com/jinzhu/nowExemplos de uso
package main
import ( "fmt" "time" "github.com/jinzhu/now")
func main() { // Início do dia beginningOfDay := now.BeginningOfDay() fmt.Println("