Integração de time, timezones & context
O pacote time do Go modela instantes, durações e eventos recorrentes.
Busque em todas as páginas da documentação
O pacote time do Go modela instantes, durações e eventos recorrentes.
context anexa prazos e cancelamento a essas operações para que os servidores parem o trabalho quando os clientes desconectam ou os orçamentos expiram.
Use time.Time para instantes de calendário e time.Duration para intervalos decorridos.
Leituras de relógio monotônicas evitam que saltos de horário de verão corrompam medições de Since.
Carregue locais com time.LoadLocation para exibição local correta; armazene UTC em bancos de dados.
Combine context.WithTimeout com chamadas bloqueantes para que as goroutines saiam prontamente.
Cartão de receita de referência rápida - pronto para copiar e colar.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
timer := time.NewTimer(500 * time.Millisecond)
defer timer.Stop()
select {
case <-timer.C:
// trabalho
case <-ctx.Done():
return ctx.Err()
}Quando usar isso:
time.Since e time.Until.time.Ticker.context.Context.package main
import (
"context"
"fmt"
"time"
)
func fetchWithDeadline(ctx context.Context, url string) error {
ctx, cancel := context.WithTimeout(ctx, 800*time.Millisecond)
defer cancel()
done := make(chan error, 1)
go func() {
// substituto para chamada net/http ou banco de dados
time.Sleep(300 * time.Millisecond)
done <- nil
}()
select {
case err := <-done:
return err
case <-ctx.Done():
return fmt.Errorf("fetch %s: %w", url, ctx.Err())
}
}
func nextBusinessOpen(now time.Time, loc *time.Location) time.Time {
local := now.In(loc)
// exemplo ingênuo: próximo 09:00 local em um dia de semana
open := time.Date(local.Year(), local.Month(), local.Day(), 9, 0, 0, 0, loc)
if !local.Before(open) {
open = open.Add(24 * time.Hour)
}
return open.UTC()
}
func main() {
loc, err := time.LoadLocation("America/New_York")
if err != nil {
panic(err)
}
if err := fetchWithDeadline(context.Background(), "https://example.com"); err != nil {
panic(err)
}
utcNow := time.Now().UTC()
fmt.Println("próximo aberto UTC:", nextBusinessOpen(utcNow, loc))
}O que isso demonstra:
select conectando trabalho bloqueante e cancelamento.LoadLocation para nomes de zona IANA e conversão de instantes de exibição para UTC.time.Now captura leituras de relógio de parede e monotônicas em um único valor time.Time.t2.Sub(t1)) usa leituras monotônicas quando ambos os tempos compartilham a mesma base monotônica.time.Timer dispara uma vez; time.Ticker repete até Stop.context.WithDeadline e WithTimeout agendam cancel() automático em um instante derivado de time.Time.| Tipo | Usar para | Evitar para |
|---|---|---|
time.Time | Instantes, serialização com RFC3339 | Armazenar segundos Unix brutos sem informações de zona |
time.Duration | Timeouts, backoff, métricas | Aritmética de calendário (use AddDate) |
time.Location | Exibição regional | time.FixedZone fixo para regiões com horário de verão |
time.Ticker | Despejo periódico de métricas | Atrasos de um único disparo (use Timer) |
// Analisa e formata com layouts explícitos (tempo de referência Seg 2 de Jan 15:04:05 MST 2006):
t, _ := time.Parse(time.RFC3339, "2026-07-15T12:00:00Z")
// Sleep não é cancelável - prefira select:
select {
case <-time.After(delay):
case <-ctx.Done():
return ctx.Err()
}time.Sleep sem context - O desligamento e o cancelamento do cliente não podem interromper o sleep. Correção: select em ctx.Done() e time.After.Location.timer.Stop() ou ticker.Stop() - Vazamentos de goroutines até o tempo de disparo. Correção: defer Stop() imediatamente após a criação.time.Time com == entre zonas - O mesmo instante pode diferir nos campos de exibição. Correção: compare t1.Equal(t2) ou converta ambos para UTC.time.After em loops apertados - Cria um novo timer por iteração. Correção: reutilize time.NewTimer e reinicie cuidadosamente.context.Background() em servidores - Ignora o cancelamento da solicitação de entrada. Correção: aceite ctx de r.Context() ou escopo pai.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
time.Tick | Apenas demonstrações rápidas | Código de produção (não pode parar o ticker subjacente) |
Bibliotecas cron | Agendamentos complexos | Intervalos fixos simples são suficientes |
Milissegundos Unix int64 | Formato de fio entre linguagens | Matemática de duração em processo sem conversão |
Falsificações de teste clock | Testes determinísticos | Agendamento de produção |
Uma leitura oculta dentro de time.Time usada para medições de duração.
Ignora ajustes de relógio de parede como saltos NTP ao calcular Since e Until.
Armazene instantes UTC em bancos de dados, frequentemente como TIMESTAMPTZ ou strings RFC3339.
Use time.Time em código Go para semântica de zona e monotônica.
time.LoadLocation("Europe/Berlin") usando nomes IANA do banco de dados zoneinfo fornecido com o Go.
Evite codificar offsets UTC+1 para regiões com horário de verão.
Um Timer envia um valor em C após um atraso.
Um Ticker envia repetidamente até Stop.
Use tickers para loops de heartbeat, timers para atrasos de um único disparo.
cancel libera os recursos do timer associado antecipadamente se o trabalho for concluído antes do prazo.
É necessário mesmo quando o timeout dispara.
Os timeouts de leitura/escrita do http.Server cancelam r.Context() quando disparam.
Os manipuladores devem passar r.Context() para downstream para que as chamadas ao banco de dados também parem.
ParseDuration suporta de ns a horas (h).
Para dias ou meses, use time.AddDate em time.Time, não strings de duração.
O prazo do context expirou antes que o trabalho fosse concluído.
Diferencie de context.Canceled quando algo explicitamente chamou cancel().
time.Now retorna o horário local de parede com a localização definida como Local.
Chame .UTC() antes de persistir ou comparar entre máquinas.
Injete uma pequena interface que encapsula Now e After, ou passe prazos como parâmetros.
Evite dormir tempo real em testes unitários.
time.Tick não pode ser parado, vazando uma goroutine para o tempo de vida do processo.
Use time.NewTicker e Stop em vez disso.
Um select com default pode girar ocupado se você consultar ticker.C sem bloquear.
Estruture loops para bloquear em ticker.C ou combine com ctx.Done().
time.SinceVersões de Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026