Por que os carimbos de data / hora têm um limite de 2038?
Pergunta
Acabei de descobrir, executando um script de calendário, que os carimbos de data / hora em PHP têm um limite de 2038. O que isso realmente significa?Por que é 2038 em vez de 2050 ou 2039?Por que um limite se os carimbos de data / hora contam apenas os segundos de uma determinada data (1970)?
Solução
O limite é imposto pelos inteiros assinados de 4 bytes que a maioria das bibliotecas C usa para representar essa contagem.Matemática rápida (assume 365 dias, anos, não exatamente correto):
2147483648 seconds ~ 68.1 years
Isso também implica em um limite inferior de ~ 1900.Algumas bibliotecas começaram a introduzir contagens de época de 64 bits, mas são poucas no momento.
Outras dicas
O valor máximo de um número inteiro de 32 bits é 2.147.483.647.Se você adicionar +1 a isso, você obtém -2.147.483.647.2.147.483.647 segundos de 01-01-1970 00:00:00 é 19 de janeiro de 2038. Se você adicionar mais um segundo, obterá uma data em algum lugar em 1902.
devido ao limite do tipo de dados INT na máquina de 32 bits
http://php.net/manual/en/function.mktime.php
De php.net: "A data máxima possível aceita por mktime () e gmmktime () depende do fuso horário da localização atual.
Por exemplo, o estouro do carimbo de data / hora de 32 bits ocorre em 2038-01-19T03: 14: 08 + 0000Z.Mas se você estiver em um fuso horário UTC -0500 (como EST na América do Norte), o tempo máximo aceito antes do estouro (para versões anteriores do PHP no Windows) é 2038-01-18T22: 14: 07-0500Z, independentementese você está passando para mktime () ou gmmktime (). "
Meu palpite é que ele é armazenado em um número fixo de bits, o que significa um limite de quão grande o carimbo de data / hora pode chegar.Poderíamos fazer algumas contas para descobrir exatamente.