Introdução ao trabalho com datas e horas em Go
Trabalhar com datas e horas é uma das tarefas principais em qualquer linguagem de programação. A linguagem Go (Golang) fornece um pacote poderoso e intuitivo chamado time, que permite realizar todas as operações básicas: obter a hora atual, fazer parsing de strings, formatar, calcular diferenças, criar timers e muito mais. Ao contrário de algumas outras linguagens, Go usa um formato de data de referência único, o que torna o código mais legível e previsível. Neste artigo, vamos detalhar as principais funcionalidades do pacote time com exemplos práticos.
Tipos principais e obtenção da hora atual
Tipo time.Time
O tipo central no pacote time é a estrutura time.Time. Ela armazena informações sobre segundos, nanossegundos, fuso horário e um contador monotônico (para medições precisas).
Obtendo o momento atual
Para obter a hora atual, usa-se a função time.Now(). Ela retorna a hora local com base nas configurações do sistema.
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()) fmt.Println("Horas:", now.Hour()) fmt.Println("Minutos:", now.Minute()) fmt.Println("Segundos:", now.Second()) fmt.Println("Nanossegundos:", now.Nanosecond()) fmt.Println("Dia da semana:", now.Weekday())}Criando uma hora manualmente
Você pode criar um momento específico usando a função time.Date(). Ela recebe ano, mês, dia, hora, minuto, segundo, nanossegundo e fuso horário.
package main
import ( "fmt" "time")
func main() { // 15 de março de 2025, 14:30:00, UTC specificDate := time.Date(2025, time.March, 15, 14, 30, 0, 0, time.UTC) fmt.Println("Data criada:", specificDate)}Parsing e formatação de datas
Formato de referência do Go
Go usa uma abordagem única para formatação: em vez de códigos como YYYY-MM-DD, usa-se a data de referência Mon Jan 2 15:04:05 MST 2006 (ou abreviadamente 2006-01-02T15:04:05Z07:00). Isso significa que para indicar o ano você escreve 2006, para o mês — 01, para o dia — 02, para a hora — 15 (ou 03 para o formato de 12 horas), para o minuto — 04, para o segundo — 05.
Formatando hora em string
O método Format() converte time.Time em uma string de acordo com o padrão fornecido.
package main
import ( "fmt" "time")
func main() { now := time.Now() fmt.Println("Formato padrão:", now.Format("2006-01-02 15:04:05")) fmt.Println("Formato português:", now.Format("02.01.2006 15:04")) fmt.Println("Apenas data:", now.Format("02 Jan 2006")) fmt.Println("Formato 12 horas:", now.Format("03:04:05 PM"))}Parsing de string para data
A função time.Parse() converte uma string em time.Time. É importante que a string corresponda ao padrão.
package main
import ( "fmt" "time")
func main() { dateStr := "2025-03-15 14:30:00" layout := "2006-01-02 15:04:05" parsedTime, err := time.Parse(layout, dateStr) if err != nil { fmt.Println("Erro de parsing:", err) return } fmt.Println("Hora parseada:", parsedTime) fmt.Println("Dia da semana:", parsedTime.Weekday())}Parsing com fuso horário
Para strings com fuso horário, use time.ParseInLocation() ou indique o offset no padrão (Z07:00).
package main
import ( "fmt" "tim