Conversor de Timestamp Unix: um número sem fuso horário, e o problema de 2038
Um timestamp Unix é a contagem de segundos decorridos desde
1970-01-01T00:00:00Z (a "época Unix") — um único número
inteiro, sem componente de fuso horário embutido. Isso costuma ser mal
entendido: o timestamp em si não "está" em nenhum fuso — ele representa
um instante absoluto no tempo, e a conversão para uma data legível
(dia, mês, ano, hora) só faz sentido quando combinada com um fuso
horário de referência, escolhido no momento da exibição, não no momento
da geração do timestamp.
O erro mais comum: confundir segundos com milissegundos
JavaScript (Date.now()) retorna milissegundos desde a
época Unix; a maioria das APIs de backend e bancos de dados (incluindo
a função time() do PHP) retorna segundos. Passar um
timestamp em milissegundos para uma função que espera segundos produz
uma data 1000 vezes mais distante do esperado — tipicamente uma data
muito no futuro (ano ~54000) quando o erro é milissegundos tratados
como segundos, ou uma data próxima de 1970 quando é o inverso. Esse
tipo de bug de unidade é comum o suficiente para valer a checagem
explícita: um timestamp em segundos "razoável" para os próximos anos
tem 10 dígitos; em milissegundos, 13.
O Problema de 2038, e por que ele ainda é relevante
Sistemas que armazenam timestamp Unix como inteiro de 32 bits com sinal
(um padrão histórico em C e em muitos bancos de dados/sistemas mais
antigos) têm um limite físico: o maior valor representável estoura em
2038-01-19T03:14:07Z, quando o contador ultrapassa
2.147.483.647 segundos e sofre overflow (voltando, tipicamente, para um
valor negativo, que se traduz numa data em 1901). Sistemas modernos que
usam inteiro de 64 bits não têm esse limite prático (o overflow
aconteceria bilhões de anos no futuro), mas código legado, alguns
formatos de arquivo e sistemas embarcados mais antigos ainda usam 32
bits — testar explicitamente datas próximas de 2038 é uma forma direta
de expor esse tipo de limitação antes que ela vire um incidente real.