22/100 Dias de Golang - Biblioteca “time”
Table of Contents
#
Biblioteca “time”
Já usamos em vários exemplos essa biblioteca, usando para o famose sleep. Agora vamos dar uma olhada mais a fundo nela. Já vamos começar com a mais clásica de todas, pegar o horário atual
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println(now)
}
Se você executar esse programa, verá uma saída nesse format:
2025-04-03 21:31:41.020649931 -0300 -03 m=+0.000047023
Perceba que o timezone vem no fomato -0300
e no formato abreviado -03
. O diferente é o retorno do m=+0.000047023
. Esse campo aparece quando imprimimos diretamente um time.Time
. Esse valor é conhecido como “monotonic clock reading”, ou tempo monotônico, e serve para ajudar o Go a fazer medições de tempo com alta precisão. m=+0.000058133
quer dizer que o Go registrou esse momento como sendo +58.133 microssegundos desde um ponto de referência interno. Ele serve para medir duração entre eventos, como timers, benchmarks, e medições de performance.
Agora vamos acessar, o ano, mês, dia, hora, … da variável now:
fmt.Println("Ano:", now.Year())
fmt.Println("Mês:", now.Month())
fmt.Println("Dia:", now.Day())
fmt.Println("Hora:", now.Hour())
Ano: 2025 Mês: April Dia: 3 Hora: 21
Vamos formatar o now
para o padrão Dia/Mês/Ano Hora:Minuto:Segundo
formatado := now.Format("02/01/2006 15:04:05")
fmt.Println("Data formatada:", formatado)
Veja que usei um formato específico ali no Format()
. A formatação de datas no Go é realmente diferente da maioria das linguagens! Em vez de usar códigos tradicionais como “YYYY-MM-DD” ou “HH:mm:ss”, o Go usa um exemplo fixo de data e hora:
Mon Jan 2 15:04:05 MST 2006
Isso significa que para formatar ou fazer parsing de datas, você precisa usar esse exato conjunto de números e palavras para representar os componentes de tempo. Muito louco isso. Veja a ordem:
1 → Mês (Janeiro) 2 → Dia do mês 3 → Hora (formato 12h) 4 → Minuto 5 → Segundo 6 → Ano (2006) -7 → Fuso horário (MST, UTC-7) 15 → Hora no formato 24h
Isso significa que se eu quiser escrever uma data no padrão DD/MM/YYYY
, preciso passar para o format: 02/01/2006
. Veja como fica o exemplo de receber um string de uma data e fazer o parse para um time.Time
:
dataStr := "03/04/2025 21:00:00"
data, err := time.Parse("02/01/2006 15:04:05", dataStr)
if err != nil {
fmt.Println("Erro ao converter a data:", err)
}
fmt.Println("Data convertida:", data)
#
Diferença entre datas:
Vamos descobrir a diferença entre dois segundos…rsrs
inicio := time.Now()
time.Sleep(2 * time.Second)
fim := time.Now()
duracao := fim.Sub(inicio)
fmt.Println("Duração:", duracao)
Duração: 2.001073493s
Podemos somar valores também:
amanha := now.Add(24 * time.Hour)
ontem := now.Add(-24 * time.Hour)
Para quem vem do Python, bem parecido com o modelo da biblioteca pendulum
. Existem várias outras coisas para vermos nessa biblioteca.