DevBento logoDevBento
Ferramentas/Conversor de Timestamp Unix: de Conversão Epoch/O Problema Y2K38

O Problema Y2K38

O timestamp Unix 2147483647 estoura o inteiro de 32 bits em 19 de janeiro de 2038 às 03:14:07 UTC. Sistemas em risco e como migrar time_t de 32 para 64 bits.

Ferramentas Relacionadas
jwtDecodificador de JWT
Decode JWT exp and iat timestamps
* *Construtor de Expressões Cron
Convert timestamp to a cron schedule
uuidGerador de UUID
Generate a time-based UUID v7
🌍Conversor de Fuso Horário
Converta horário entre fusos horários IANA com ajuste automático de DST. Adicione múltiplos destinos e veja offsets UTC e abreviações de fuso horário.

O Número Por Tras do Problema

2147483647 e 2^31 - 1, o valor máximo de um inteiro com sinal de 32 bits. Em binario:

01111111 11111111 11111111 11111111

O 0 inicial é o bit de sinal. Quando os timestamps Unix foram projetados no final dos anos 1960, armazenar tempo como um inteiro de 32 bits foi uma escolha pragmatica que equilibrava precisão, custo de armazenamento é a faixa disponível. Um inteiro com sinal de 32 bits oferece aproximadamente 68 anos de timestamps positivos a partir de 1 de janeiro de 1970. Isso era margem suficiente para o futuro previsível em 1969.

Esse futuro e agora 19 de janeiro de 2038 as 03:14:07 UTC.

O Que Acontece no Estouro

Um segundo apos 2147483647, um contador com sinal de 32 bits estoura:

01111111 11111111 11111111 11111111  (2147483647)
+1
10000000 00000000 00000000 00000000  (-2147483648 em complemento de dois)

O padrão de bits 0x80000000, interpretado como um inteiro com sinal, e -2147483648. Como timestamp Unix, isso corresponde a 13 de dezembro de 1901 as 20:45:52 UTC. Qualquer sistema que armazene, compare ou exiba timestamps usando um inteiro com sinal de 32 bits experimentara um de:

Comparação com Y2K

Y2K (Problema do Ano 2000) foi causado por representações de ano de dois dígitos (9900). Era generalizado porque quase todos os softwares escritos antes do final dos anos 1990 usavam este formato, é o modo de falha era corrupção silenciosa de dados (o ano 2000 poderia ser interpretado como 1900).

Y2K38 e estruturalmente similar, mas mais contido:

Uma diferença que vale notar: alguns sistemas embarcados usam inteiros sem sinal de 32 bits para timestamps, o que estende a faixa para 2^32 - 1 = 4294967295, correspondendo a 7 de fevereiro de 2106. Isso compra significativamente mais tempo, mas esses sistemas eventualmente enfrentarão o mesmo problema.

Sistemas Ainda em Risco

Dispositivos embarcados e IoT

Muitos microcontroladores (ARM Cortex-M, MIPS, derivados AVR mais antigos) funcionam em arquiteturas de 32 bits com firmware fixo. CLPs industriais, dispositivos medicos, equipamentos de telecomúnicações e medidores inteligentes podem não ter um caminho viavel de atualização de firmware.

Bancos de dados legados

O tipo de dados TIMESTAMP do MySQL e armazenado internamente como um timestamp Unix de 32 bits e tem um valor máximo de 2038-01-19 03:14:07. O tipo DATETIME não tem esta limitação. Qualquer aplicativo usando colunas TIMESTAMP precisa migrar para DATETIME ou BIGINT antes de 2038.

-- Valor máximo de TIMESTAMP no MySQL
SELECT FROM_UNIXTIME(2147483647);
-- Retorna: 2038-01-19 03:14:07

-- DATETIME não tem tal limite (suporta até 9999)
ALTER TABLE events MODIFY created_at DATETIME(3);

Instalações Linux de 32 bits

Sistemas Linux de 32 bits mais antigos usando glibc anterior a 2.32 usam um time_t de 32 bits. Distribuições como Debian ja corrigiram isso, mas sistemas não corrigidos ou compilações personalizadas ainda podem ser afetados.

Binarios compilados

Executaveis compilados para alvos de 32 bits e nunca recompilados carregam a suposição de time_t de 32 bits mesmo se executarem em hardware de 64 bits. Isso inclui algumas extensões PHP, extensões C do Python mais antigas e aplicativos C legados.

A Correção: time_t de 64 bits

Um inteiro com sinal de 64 bits pode representar timestamps até aproximadamente ±9,2 × 10^18 segundos a partir do epoch, cerca de 292 bilhões de anos em qualquer direção. Na prática, a correção e mudar time_t de int32_t para int64_t:

// Antigo (32 bits, estoura em 2038)
typedef int32_t time_t;

// Novo (64 bits, seguro por 292 bilhões de anos)
typedef int64_t time_t;

A maioria das linguagens e runtimês modernos ja usam timestamps de 64 bits:

Implicações Práticas para Desenvolvedores

Verifique seu esquema de banco de dados

Se você tem colunas TIMESTAMP no MySQL, audite se os valores precisam representar datas posteriores a 2038. Migre para DATETIME ou armazene como BIGINT (Unix milissegundos) se for o caso.

Audite seus tipos inteiros

Se você armazena timestamps como inteiros no código, certifique-se de que são int64 / long / bigint, não int32 / int.

Teste com timestamps futuros

Adicione um teste que crie um timestamp para 20 de janeiro de 2038 e verifique se seu sistema lida corretamente com ele. Isso e barato de fazer agora e detecta o problema antes que ele importe.

import datetime

# Isso deve funcionar em qualquer sistema moderno
futuro = datetime.datetime(2038, 1, 20, tzinfo=datetime.timezone.utc)
print(futuro.timestamp())  # Deve imprimir ~2147569200, não gerar erro

Documente seus sistemas embarcados

Se sua organização opera dispositivos embarcados com firmware de 32 bits fixo, documente quais são afetados e sua vida útil esperada. Você tem até 2038 para planejar substituições, mas planejar tarde significa escolher entre uma migração apressada é uma interrupção de produção.

🔒

Nothing you paste leaves this tab. Every tool runs entirely in your browser — no upload, no server, no account.

© 2026 devbento.dev · construído localmenteChangelog