4 min de leituraAtualizado

Timestamps Unix: leap seconds, 2038 e armadilhas de fuso

Por Equipe Safe Local Tools

Um timestamp Unix é um inteiro aparentemente simples que esconde três bagunças: calendários civis, política de fusos e largura de palavra do hardware. Pense nele como instante em UTC ao sincronizar globo — mas lembre que relógios locais pulam duas vezes por ano em muitos lugares com horário de verão. Engenheiros amam armazenar segundos desde 1970-01-01T00:00:00Z porque ordena bem e soma duração — até localizar, leap second, offsets históricos ou estouro de int32 em 2038 aparecerem. E converter localmente no navegador com o Safe Local Tools ajuda a depurar logs sem colar IDs internos em conversores SaaS opacos.

OG illustration

Unix time do jeito que a maioria usa

Em geral, conta segundos não‑leap desde a época Unix em UTC; bibliotecas mapeiam para campos legíveis com base tzdata IANA que codifica regras políticas de DST.

Para referência histórica, artigos sobre Unix time e leap second resumem debates — takeaway operacional: não infira cronologia de laboratório só olhando inteiros sem saber semântica do sensor.

Leap seconds e timers de alta precisão

Rotação da Terra oscila; UTC às vezes insere leap second. Pilhas discordaram se timestamps "embesam", repetem ou pulam — POSIX espalha ambiguidade entre implementações. Para correlação de logs após normalização em pipeline, epoch costuma ser monotônico o bastante; para medir latência use relógio monotônico (performance.now), não conversão de relógio de parede.

Ano 2038 e precisão IEEE em JavaScript

time_t 32 bits com sinal transborda perto de 2038‑01‑19. Mitigue persistindo inteiros 64 bits ou strings ISO‑8601 com offset explícito; audite firmware e colunas legadas mesmo que seu serviço Node seja 64 bits.

Números ECMAScript são doubles IEEE — ok para ms perto de hoje; escalas extremas podem precisar BigInt. Cuidado clássico: confundir segundos e milissegundos em agregações — normalize no ingest com validação de esquema.

const ms = Number("2147483647000");
console.log(new Date(ms).toISOString());

JWT exp, cookies e NTP

exp de JWT é NumericDate em segundos; validadores comparam com "agora" de relógio de parede sujeito a drift quando contêiner acorda de snapshot — bandas de tolerância de dezenas de segundos existem por motivo.

Cookies misturando Max-Age e Expires com reescrita de CDN podem surpreender — inspecione cabeçalho final visto pelo navegador. Após incidentes NTP, anote correções manuais nas plataformas de observabilidade para detectores não fabricarem violação de SLO fantasma.

Fusos são política; DST duplica hora local

Corpos políticos mudam regras com pouco aviso; binários precisam atualizar tzdata. Bug clássico: gravar componentes locais sem offset (2026-03-10 02:30 na lacuna de primavera) e desserializar de modo ambíguo.

No outono, uma hora local repete — sem offset não há como distinguir primeira ocorrência da segunda em forense. Pipelines devem emitir epoch UTC junto de string localizada quando auditoria importa.

Strings livres para Date.parse variaram entre navegadores no passado; intercâmbio deve preferir ISO (YYYY-MM-DDTHH:mm:ss.sssZ).

{
  "loggedAt": "2026-05-09T15:30:00.000Z",
  "ttlSeconds": 3600
}

Banco de dados, calendário vs duração e uso do Safe Local Tools

TIMESTAMP WITHOUT TIME ZONE convida analista a achar que guardou "hora local" enquanto o engine reinterpreta com fuso de sessão — ótimo em demo, péssimo em trilha imutável multinacional. Regra dourada: persistir instantes em UTC (timestamptz/ISO) e renderizar local só na camada de UI.

Regras de negócio tipo "mesma hora local no próximo mês" seguem calendário irregular, não múltiplo fixo de segundos — misturar com TTL puramente epoch gera cobrança dupla ou buraco em assinatura.

Responders de incidente colam epochs de log em conversores web; isso expande superfície de vazamento de IDs correlacionáveis. Safe Local Tools converte timestamp no cliente, alinhado a depuração sensível — ainda valide contra monitoramento autoritativo depois.

Migração: inventarie colunas 32 bits, padronize sufixos *_ms vs *_s, emita ISO UTC para trilhas de auditoria e epoch numérico para joins analíticos. Testes de propriedade perto de transições DST salvam meses de plantão.

Planilhas exportadas pelo financeiro costumam derrubar offsets e manter strings locais ambíguas — reingerir CSV "corrigido" em warehouse desloca eventos entre trimestres fiscais se validadores não rejeitarem timestamps sem Z ou offset. Durante incidentes, logue simultaneamente epoch em ms e ISO UTC até dashboards convergirem; isso paga o café do plantão na primeira divergência entre Kibana e Snowflake.

Sensores embarcados às vezes contam a partir de épocas de vendor — documente conversão antes de correlacionar com Unix. Mesmo dentro do ecossistema JavaScript, misturar Date com bigint de nanos exige fronteira explícita para não perder precisão silenciosa em traces distribuídos.

Timestamps domesticam ordenação distribuída até política de calendário voltar — aí offsets explícitos, inteiros largos e parsing disciplinado vencem atalhos. Para converter rápido entre epoch e relógio humano sem SaaS estranho, Experimentar o conversor de timestamp Unix →