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.