Como converter timestamp Unix para data (e o erro de fuso)
A conversão tem dois pontos que quase sempre dão errado: a unidade, que pode ser segundos ou milissegundos, e o fuso, que muda o resultado em horas.
Segundos ou milissegundos?
O timestamp Unix conta segundos desde 1º de janeiro de 1970 em UTC. JavaScript, porém, trabalha em milissegundos — e essa diferença de mil é a causa mais comum de datas em 1970 ou no ano 55000.
A regra prática: um timestamp com 10 dígitos está em segundos; com 13, em milissegundos.
// ✗ timestamp em segundos tratado como milissegundos
new Date(1756800000); // 1970-01-21
// ✓ multiplique por 1000
new Date(1756800000 * 1000); // 2025-09-02
// data atual em segundos
Math.floor(Date.now() / 1000);Em cada linguagem
from datetime import datetime, timezone
# sempre informe o fuso: sem tzinfo, o resultado usa o fuso da máquina
datetime.fromtimestamp(1756800000, tz=timezone.utc)
# de volta para timestamp
int(datetime.now(timezone.utc).timestamp())$data = (new DateTimeImmutable("@1756800000"))
->setTimezone(new DateTimeZone("America/Sao_Paulo"));
echo $data->format("d/m/Y H:i");
echo (new DateTimeImmutable())->getTimestamp();-- PostgreSQL
SELECT to_timestamp(1756800000) AT TIME ZONE 'America/Sao_Paulo';
-- MySQL
SELECT FROM_UNIXTIME(1756800000);
SELECT UNIX_TIMESTAMP(NOW());O erro de fuso
Timestamp não tem fuso: ele é um instante absoluto. O fuso só entra na hora de exibir, e é aí que aparecem as diferenças de três horas em sistemas brasileiros rodando em servidores configurados em UTC.
A recomendação é sempre a mesma: guarde em UTC, converta apenas na exibição, e nunca dependa do fuso padrão da máquina — ele muda entre o seu computador e o contêiner de produção.
Formatar em português
const data = new Date(1756800000 * 1000);
new Intl.DateTimeFormat("pt-BR", {
dateStyle: "long",
timeStyle: "short",
timeZone: "America/Sao_Paulo",
}).format(data);
// "2 de setembro de 2025 às 09:00"Perguntas frequentes
- Minha data aparece como 1970. O que houve?
- O timestamp foi interpretado na unidade errada. Um valor em segundos tratado como milissegundos resulta em uma data pouco depois de 1º de janeiro de 1970. Multiplique por 1000 antes de passar ao construtor Date.
- Por que a data muda três horas em produção?
- Porque o servidor está em UTC e a sua máquina em horário de Brasília. Timestamp é absoluto: o que muda é o fuso da exibição. Defina o fuso explicitamente na formatação em vez de depender do padrão do ambiente.