Conversor de timestamp Unix
Converta um timestamp Unix numa data legível em qualquer fuso horário, e uma data de volta para epoch.
O que é um timestamp Unix
Um timestamp Unix — também chamado tempo epoch ou tempo POSIX — é um único número que conta quantos segundos passaram desde as 00:00:00 UTC de 1 de janeiro de 1970, um instante conhecido como epoch de Unix. Por ser um só inteiro, sem fuso horário, sem calendário e sem formatação, é o formato a que os computadores recorrem sempre que um instante tem de ser guardado, ordenado, comparado ou enviado pela rede. É o que está por trás da coluna «created_at» da sua base de dados, dos claims «iat» e «exp» de um JWT, do mtime de um ficheiro e dos timestamps de praticamente qualquer registo que venha a ler.
A contrapartida é que um número nu não diz nada a uma pessoa. 1716197600 é um instante perfeitamente válido, mas num relance não sabe se foi na terça-feira passada ou há três anos. Essa tradução, nos dois sentidos, é o que esta ferramenta faz.
Segundos ou milissegundos: a ambiguidade que morde
A convenção original do Unix conta segundos inteiros, e é isso que obtém de date +%s numa shell, de time() em PHP e de time.time() em Python depois de truncado. JavaScript, Java e muitos outros contam milissegundos: Date.now() devolve um número mil vezes maior. Ambos se chamam «timestamp», e confundi-los é um dos erros de datas mais comuns que existem.
A falha é silenciosa e não ruidosa. Leia um valor em milissegundos como segundos e a data aterra dezenas de milhares de anos no futuro; leia um valor em segundos como milissegundos e tudo se desmorona para janeiro de 1970. Nenhum dos dois lança um erro — simplesmente obtém uma data errada com todo o aspeto de ser verdadeira.
Esta ferramenta deduz pela ordem de grandeza do número e depois diz-lhe o que deduziu, mesmo ao lado do resultado. Os segundos epoch de hoje têm dez dígitos e os milissegundos treze, por isso o palpite está quase sempre certo — mas «quase» não chega para um valor que está prestes a colar num relatório de erro, e é por isso que a leitura está sempre visível e sempre a um clique de ser trocada.
Fusos horários, UTC e porque «local» é escorregadio
Um timestamp Unix não tem fuso horário. Identifica um instante, e esse mesmo instante é simultaneamente 09:33 em Londres, 11:33 em Jerusalém e 18:33 em Tóquio. O fuso horário não faz parte do valor: é a lente através da qual olha para ele.
Por isso esta ferramenta mostra várias lentes ao mesmo tempo. UTC é a referência neutra em que todos os servidores e registos concordam. A sua hora local é a que o seu próprio dispositivo indica, mostrada com o nome do fuso (por exemplo Europe/Berlin) para saber sempre que lente a produziu — a deteção acontece no seu navegador, por isso quem visita de Berlim vê a hora de Berlim e quem visita de Tóquio vê a de Tóquio. A terceira linha é qualquer fuso que escolha da base de dados IANA completa, e é a linha que quer quando está a ler o registo de um servidor que vive noutro sítio.
- UTC — a referência em que todos os sistemas concordam, e o correto para guardar e registar.
- Local — o mesmo instante tal como o seu dispositivo o vê, identificado com o fuso detetado.
- Um fuso à sua escolha — para ler registos e rastreios de máquinas noutros locais.
- ISO 8601 — o formato de texto de intercâmbio, p. ex. 2024-05-20T09:33:20.000Z.
- Relativo — «há 3 horas», para ter uma noção rápida de quão recente é algo.
Os desvios são mostrados junto a cada hora (+03:00, -04:00) porque não são fixos: a maioria dos fusos desloca-se uma hora com a hora de verão, portanto o mesmo fuso pode dar desvios diferentes em alturas diferentes do ano. Uma data perto de uma mudança é precisamente onde as contas de cabeça falham.
Trabalhar com tempo epoch na prática
Cada linguagem e cada shell tem a sua maneira de produzir e ler valores epoch. Estas vale a pena guardar:
date +%s # shell: hora atual em segundos date -d @1716197600 # shell (GNU): de segundos para data Date.now() # JavaScript: hora atual em MILIssegundos new Date(1716197600 * 1000) # JavaScript: de segundos para Date time.time() # Python: segundos, como decimal datetime.fromtimestamp(1716197600, tz=timezone.utc) SELECT EXTRACT(EPOCH FROM now()) -- PostgreSQL: segundos
Uma regra prática que evita quase toda a dor com datas: guarde e transmita instantes em UTC — como inteiro epoch ou como cadeia ISO 8601 — e converta para um fuso local só no último momento, quando os mostra mesmo a alguém. Formatar cedo demais é como um erro de fuso horário acaba cozido dentro dos seus dados em vez de ficar na camada de apresentação.
Mais uma coisa que convém saber: um contador de segundos de 32 bits com sinal esgota-se a 19 de janeiro de 2038, o «problema do ano 2038». Os sistemas modernos usam valores de 64 bits e estão seguros, mas os dispositivos embebidos antigos e as colunas de bases de dados herdadas são exatamente onde ainda o pode encontrar.
Perguntas frequentes
- Como sabe se o meu número está em segundos ou milissegundos?
- Pela sua ordem de grandeza: valores abaixo de cerca de 1e11 são lidos como segundos e os maiores como milissegundos. Hoje isso separa de forma limpa os segundos de dez dígitos dos milissegundos de treze. A leitura é mostrada ao lado do resultado e pode trocá-la com um clique, por isso a dedução nunca lhe é escondida.
- Que fuso horário conta como «local»?
- O que o seu próprio dispositivo indica, detetado no navegador e mostrado pelo nome para não restarem dúvidas. É o seu fuso, não o do site: quem visita de Berlim vê a hora de Berlim e quem visita de Tóquio vê a de Tóquio.
- Posso converter uma data de volta para timestamp?
- Sim. O mesmo campo aceita os dois sentidos: escreva um número e obtém uma data; escreva uma data como 2024-05-20 ou 2024-05-20T09:33:20Z e obtém o valor epoch. Não há modo nenhum para trocar.
- Lida com datas anteriores a 1970?
- Sim. Os timestamps anteriores ao epoch são simplesmente negativos — -86400 é 31 de dezembro de 1969 — e os valores negativos são aceites e convertidos normalmente.
- Porque é que o meu timestamp mostra uma data diferente da esperada?
- Quase sempre por um de dois motivos: a leitura segundos/milissegundos não é a que assumiu (veja a etiqueta e troque-a), ou está a comparar um valor UTC com uma expectativa em hora local. A ferramenta mostra as duas linhas lado a lado para que veja qual dos casos é.
- O que é o problema do ano 2038?
- Os sistemas que guardam segundos epoch num inteiro de 32 bits com sinal transbordam a 19 de janeiro de 2038 e passam a um número negativo, dando datas em 1901. Tudo o que usa valores de 64 bits — ou seja, quase tudo o que é moderno — não é afetado, mas os sistemas embebidos herdados e as colunas antigas de bases de dados ainda podem estar em risco.
- O timestamp que introduzo é enviado para algum lado?
- Não. A análise, a conversão e a formatação correm inteiramente no seu navegador, apoiando-se no suporte de datas e fusos horários da própria plataforma. Nada do que escrever sai do seu dispositivo.