FAQ sobre timestamps Unix

Respostas rápidas às perguntas mais comuns sobre timestamps Unix — unidades, tratamento de fusos, o problema do ano 2038, conversões específicas de cada linguagem e mais.

Perguntas frequentes

Perguntas comuns sobre marcas de tempo Unix, tempo epoch, fusos horários e como armazenar o tempo corretamente — organizadas por tópico. Use as respostas como referência rápida; guias mais aprofundados estão vinculados no rodapé da página.

Para onde ir em seguida

FAQ

O que é uma marca de tempo Unix?
Uma marca de tempo Unix é o número de segundos decorridos desde o epoch Unix — 1º de janeiro de 1970 às 00:00:00 UTC. É um inteiro neutro em relação à linguagem e independente de fuso horário que identifica de forma única qualquer momento no tempo.
O que é o epoch Unix?
O epoch Unix é 1º de janeiro de 1970 às 00:00:00 UTC. Todas as marcas de tempo Unix são medidas para a frente — ou para trás, no caso de valores negativos — a partir desse ponto de referência fixo. A escolha de 1970 foi prática: era um ano recente e redondo quando o Unix estava sendo projetado no Bell Labs.
Qual é a diferença entre uma marca de tempo de 10 dígitos e uma de 13?
Uma marca de tempo de 10 dígitos (p. ex. 1700000000) representa segundos desde o epoch. Uma de 13 dígitos (p. ex. 1700000000000) representa milissegundos. O Date.now() do JavaScript retorna milissegundos; a maioria das chamadas de sistema Unix e linguagens como Python, Go e PHP retornam segundos por padrão.
Por que o JavaScript usa milissegundos em vez de segundos?
A API Date do JavaScript foi projetada para corresponder à resolução dos temporizadores de sistema disponíveis em 1995. Usar milissegundos evita a perda de precisão em durações abaixo de um segundo. Ao trabalhar com marcas de tempo Unix em segundos geradas pelo servidor, multiplique por 1000 antes de passar para new Date().
Como converto uma marca de tempo Unix para uma data legível em JavaScript?
Para uma marca em segundos: new Date(1700000000 * 1000).toISOString(). Para uma marca em milissegundos: new Date(1700000000000).toISOString(). Ambas produzem strings ISO 8601 como '2023-11-15T06:13:20.000Z'. Use toLocaleString() com uma opção timeZone para exibição localizada.
As marcas de tempo Unix têm consciência de fuso horário?
Não. Uma marca de tempo Unix sempre representa um único momento em UTC. As informações de fuso só são aplicadas ao formatar a marca para exibição. Dois dispositivos em fusos diferentes produzirão a mesma marca de tempo Unix para o mesmo instante.
O que é o problema do ano 2038?
Sistemas que armazenam marcas de tempo Unix como inteiros com sinal de 32 bits só podem representar valores até 2.147.483.647, que corresponde a 19 de janeiro de 2038 às 03:14:07 UTC. Após esse momento, o inteiro estoura para um número negativo grande. Sistemas modernos de 64 bits não são afetados, mas sistemas embarcados e bancos de dados legados ainda podem estar em risco.
O que é uma marca de tempo Unix negativa?
Uma marca de tempo Unix negativa representa um momento anterior ao epoch Unix. Por exemplo, -86400 é 31 de dezembro de 1969 às 00:00:00 UTC. A maioria das APIs de data modernas lida corretamente com marcas negativas, mas alguns sistemas e bancos de dados mais antigos não as suportam.
Como obtenho uma marca de tempo Unix em Python?
Use import time; int(time.time()) para segundos. Para um datetime UTC explícito: import datetime; int(datetime.datetime.now(datetime.timezone.utc).timestamp()). Para milissegundos: int(time.time() * 1000).
Qual é a precisão de uma marca de tempo Unix?
Uma marca de tempo Unix padrão tem precisão de um segundo. Para precisão abaixo de um segundo, marcas em milissegundos (13 dígitos) são comuns em APIs web e JavaScript. Alguns sistemas usam microssegundos (16 dígitos) ou nanossegundos. A unidade apropriada depende da precisão de que a sua aplicação realmente precisa.
Quão grande pode ser uma marca de tempo Unix?
Em um inteiro com sinal de 64 bits (o padrão atual), as marcas de tempo Unix podem representar qualquer momento de cerca de 292 bilhões de anos atrás a 292 bilhões de anos no futuro. O famoso limite de 32 bits (o problema do ano 2038) só se aplica a sistemas legados.
Por que a minha marca de tempo mostra 1970?
Geralmente por um de três motivos: o valor é 0 (o próprio epoch), o valor está em milissegundos mas foi tratado como segundos (então arredonda para um valor de segundos minúsculo perto de 0), ou o valor é null/undefined e o seu código o definiu por padrão como 0.
Qual é a diferença entre UTC e GMT?
Para a maioria dos fins, UTC e GMT são intercambiáveis. UTC (Tempo Universal Coordenado) é o padrão atômico moderno; GMT (Hora de Greenwich) é um termo legado para o fuso com deslocamento zero. O Reino Unido e a maioria dos softwares os tratam como equivalentes.
Devo armazenar datas como marcas de tempo Unix ou como strings ISO 8601?
Ambos funcionam. Inteiros Unix são compactos e triviais de comparar; strings ISO 8601 são autodescritivas e legíveis por humanos. Em bancos de dados, os tipos datetime nativos (TIMESTAMP WITH TIME ZONE no Postgres, DATETIME(6) no MySQL) costumam ser melhores porque preservam a semântica de fuso e indexam de forma eficiente.
É seguro armazenar a hora local do meu servidor?
Não. Armazenar a hora local sem um deslocamento perde informações sempre que o servidor muda de lugar, o horário de verão muda ou outro servidor em um fuso diferente lê o valor. Armazene UTC (como marca de tempo Unix ou datetime ciente de fuso) e converta para hora local apenas na camada de exibição.
As marcas de tempo Unix incluem segundos bissextos?
O tempo Unix POSIX ignora deliberadamente os segundos bissextos — cada dia Unix tem exatamente 86.400 segundos mesmo quando um segundo UTC extra é inserido. O número de segundo real é repetido ou o relógio é suavizado, dependendo do sistema.