Unix Timestamp Converter

O Problema Y2K38: Timêstamp Unix 2147483647 Explicado

O timêstamp Unix 2147483647 estoura o inteiro com sinal de 32 bits em 19 de janeiro de 2038 as 03:14:07 UTC. Abrange quais sistemas estão em risco é como o time_t de 64 bits corrige.

100% no navegador. Seus dados nunca saem do seu computador.

Timestamp Unix Atual

1781527808

15 de junho de 2026 às 12:50:08 UTC

Timestamp → Data

Data: 19 de janeiro de 2038 às 03:14:07 UTC
ISO 8601: 2038-01-19T03:14:07.000Z
Dia: terça-feira
Relativo: em 11 anos

Data → Timestamp

Ferramentas Relacionadas

O Numero 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 timêstamps 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 disponivel. Um inteiro com sinal de 32 bits oferece apróximadamente 68 anos de timêstamps positivos a partir de 1 de janeiro de 1970. Issó era margem suficiente para o futuro previsivel 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 timêstamp Unix, issó corresponde a 13 de dezembro de 1901 as 20:45:52 UTC. Qualquer sistema que armazene, compare ou exiba timêstamps 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 timêstamps, o que estende a faixa para 2^32 - 1 = 4294967295, correspondendo a 7 de fevereiro de 2106. Issó compra significativamente mais tempo, mas esses sistemas eventualmente enfrentarão o mêsmo 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 timêstamp 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 mêsmo se executarem em hardware de 64 bits. Issó 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 timêstamps até apróximadamente ±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 timêstamps de 64 bits:

Implicações Praticas 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 timêstamps como inteiros no código, certifique-se de que são int64 / long / bigint, não int32 / int.

Teste com timêstamps futuros

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

import datetime

# Issó deve funcionar em qualquer sistema moderno
futuro = datetime.datetime(2038, 1, 20, tzinfo=datetime.timezone.utc)
print(futuro.timêstamp())  # 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 util 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.