Trabalhando com Datas e Horários em Go: do Básico às Técnicas Avançadas
A linguagem de programação Go (Golang) oferece um pacote time poderoso e intuitivo para trabalhar com datas e horários. Ao contrário de muitas outras linguagens, Go usa uma abordagem única para formatação, baseada em uma data de referência (Mon Jan 2 15:04:05 MST 2006). Neste artigo, vamos detalhar todos os aspectos principais: desde a criação de objetos de tempo até o trabalho com temporizadores e fusos horários. O material será útil tanto para iniciantes quanto para desenvolvedores experientes que estão migrando para Go.
1. Fundamentos: criação, obtenção e exibição de horários
O tipo central para trabalhar é time.Time. Obtenha o momento atual com time.Now(). Para criar uma data específica, use time.Date().
package main
import ( "fmt" "time")
func main() { // Horário atual now := time.Now() fmt.Println("Agora:", now)
// Criando uma data específica (ano, mês, dia, hora, min, seg, nanoseg, Location) specific := time.Date(2025, time.January, 15, 10, 30, 0, 0, time.UTC) fmt.Println("Data específica:", specific)
// Extraindo componentes fmt.Println("Ano:", now.Year()) fmt.Println("Mês:", now.Month()) fmt.Println("Dia:", now.Day()) fmt.Println("Hora:", now.Hour()) fmt.Println("Minuto:", now.Minute()) fmt.Println("Segundo:", now.Second()) fmt.Println("Dia da semana:", now.Weekday())}A saída do programa mostrará o horário atual e seus componentes. Observe: time.Now() retorna o horário no fuso horário local do sistema.
2. Formatação e parsing: a característica distintiva do Go
Em Go, a formatação de datas não ocorre através de caracteres como YYYY-MM-DD, mas sim através de uma data de referência: Mon Jan 2 15:04:05 MST 2006 (ou 01/02 03:04:05PM '06 -0700). Lembre-se desta string mágica — ela se parece com 1 2 3 4 5 6 -7.
- 1 — mês (01, Jan, January)
- 2 — dia (02, 2)
- 3 — hora no formato de 12 horas (03, 3)
- 4 — minuto (04, 4)
- 5 — segundo (05, 5)
- 6 — ano (06, 2006)
- -7 — fuso horário (MST, -0700, -07:00)
Formatação (Time → String)
now := time.Now()
// Formatos padrãofmt.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 UTCParsing (String → Time)
// Fazendo parsing de uma string para 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("Parseado:", parsedTime)
// Parsing com fuso horáriodateWithZone := "2025-01-15T10:30:45+03:00"parsedWithZone, _ := time.Parse(time.RFC3339, dateWithZone)fmt.Println("Com fuso:", parsedWithZone)Se você precisar fazer parsing de uma data em um fuso horário específico, use time.ParseInLocation().
3. Operações com datas: Duration, Add, Sub e comparação
O tipo time.Duration representa um intervalo de tempo. Go fornece constantes: Nanosecond, Microsecond, Millisecond, Second, Minute, Hour.
now := time.Now()
// Adicionando tempofuture := now.Add(72 * time.Hour) // +3 diasfmt.Println("Daqui a 72 horas:", future)
// Subtraindo tempopast := now.Add(-30 * time.Minute) // 30 minutos atrásfmt.P