O problema do ano 2038 (Y2K38) explicado

Em 19 de janeiro de 2038 às 03:14:07 UTC, o timestamp Unix 2.147.483.647 — o valor máximo de um inteiro com sinal de 32 bits — vai transbordar. Veja o que isso significa, quais sistemas são afetados e por que a maior parte do código moderno já está segura.

O que é o problema do ano 2038?

Os timestamps Unix são tradicionalmente armazenados como um inteiro com sinal de 32 bits que conta os segundos desde 1 de janeiro de 1970 00:00:00 UTC. O valor máximo de um inteiro com sinal de 32 bits é 2,147,483,647, que corresponde a 19 de janeiro de 2038 às 03:14:07 UTC. Um segundo depois, o inteiro estoura para -2,147,483,648. Interpretado como timestamp Unix, esse valor negativo corresponde a 13 de dezembro de 1901, jogando os sistemas afetados quase 137 anos para o passado.

Os valores do estouro

  • 2^31 − 1 = 2,147,483,647 (inteiro com sinal de 32 bits máximo)
  • 2,147,483,647 como data = 19 de janeiro de 2038 03:14:07 UTC
  • 2,147,483,647 + 1 estoura para −2,147,483,648 (o valor de 32 bits mais negativo)
  • −2,147,483,648 como data = 13 de dezembro de 1901 20:45:52 UTC

Quais sistemas estão em risco?

O problema afeta sistemas que armazenam timestamps como inteiros com sinal de 32 bits:

  • Sistemas embarcados e microcontroladores com time_t de 32 bits
  • Código C e C++ legado compilado para alvos de 32 bits usando time_t ou int para timestamps
  • Kernels Linux antigos (anteriores ao 5.6) em hardware de 32 bits ainda em produção
  • Colunas TIMESTAMP do MySQL — limitadas a 2038-01-19; use DATETIME no lugar
  • Alguns protocolos de rede e formatos de arquivo que codificam timestamps como valores de 32 bits
  • Firmware em sistemas de controle industrial e dispositivos IoT com vida útil de décadas

Quais sistemas são seguros?

A maior parte do código e da infraestrutura modernos já não é afetada:

  • Qualquer SO de 64 bits — Linux (glibc 2.34+ também corrige hardware de 32 bits), macOS, Windows
  • Python — timestamps usam floats de 64 bits, seguros muito além do ano 292 milhões
  • JavaScript — Date usa floats IEEE 754 de 64 bits, seguro até o ano 275,760
  • Go e Rust — usam int64 para tempo internamente, seguros por bilhões de anos
  • Java — java.time.Instant usa long (64 bits), seguro até o ano ~292 milhões
  • PostgreSQL TIMESTAMP — armazena datas além de 2038 corretamente
  • MySQL DATETIME — faixa 1000-01-01 a 9999-12-31, não afetado

FAQ do problema do ano 2038

O que é o problema do ano 2038?
O problema do ano 2038 (Y2K38) é um bug em que sistemas que usam inteiros com sinal de 32 bits para armazenar timestamps Unix vão estourar em 19 de janeiro de 2038 às 03:14:07 UTC. O valor máximo de um inteiro com sinal de 32 bits é 2,147,483,647. Um segundo depois, o inteiro vira -2,147,483,648, que corresponde a 13 de dezembro de 1901.
Qual é o timestamp Unix de 19 de janeiro de 2038?
O timestamp Unix de 19 de janeiro de 2038 às 03:14:07 UTC é 2,147,483,647 — o valor máximo de um inteiro com sinal de 32 bits (2^31 - 1). É o momento exato em que ocorre o estouro do ano 2038 em sistemas de 32 bits.
Y2K38 é o mesmo que Y2K?
Não. O Y2K (problema do ano 2000) era causado por programas que armazenavam anos com 2 dígitos. O Y2K38 é causado por armazenar timestamps Unix como inteiros com sinal de 32 bits que estouram em 2038. Causas diferentes, sistemas afetados diferentes.
A internet vai quebrar em 2038?
Provavelmente não de forma significativa. A maior parte da infraestrutura da internet já migrou para sistemas de 64 bits. O risco se concentra em sistemas embarcados, dispositivos IoT legados e software sem atualização há décadas. Sistemas operacionais, linguagens e bancos de dados modernos já são seguros.