Eu estava pensando em usar TIMESTAMP para armazenar a data + hora, mas li que há uma limitação do ano 2038 nele. Em vez de fazer minha pergunta em massa, preferi dividi-la em pequenas partes para que seja fácil para usuários novatos entenderem também. Então, minha (s) pergunta (s):
- Qual é exatamente o problema do ano 2038?
- Por que isso ocorre e o que acontece quando ocorre?
- Como resolvemos isso?
- Existem alternativas possíveis para usá-lo, que não representam um problema semelhante?
- O que podemos fazer com os aplicativos existentes que utilizam o TIMESTAMP, para evitar o chamado problema, quando ele realmente ocorre?
Desde já, obrigado.
Respostas:
Eu marquei este como um wiki da comunidade, então fique à vontade para editar quando quiser.
Qual é exatamente o problema do ano 2038?
"O problema do ano 2038 (também conhecido como Bug Unix Millennium, Y2K38 por analogia ao problema Y2K) pode fazer com que alguns softwares de computador falhem antes ou no ano de 2038. O problema afeta todos os softwares e sistemas que armazenam a hora do sistema como um 32 assinado -bit inteiro, e interpretar esse número como o número de segundos desde 00:00:00 UTC em 1º de janeiro de 1970. "
Por que isso ocorre e o que acontece quando ocorre?
Vezes além de 03:14:07 UTC na terça-feira, 19 de janeiro de 2038 serão ' agrupados ' e armazenados internamente como um número negativo, que esses sistemas interpretarão como um tempo em 13 de dezembro de 1901 em vez de 2038. Isso se deve a o fato de que o número de segundos desde a época do UNIX (1 de janeiro de 1970 00:00:00 GMT) terá excedido o valor máximo de um computador para um inteiro assinado de 32 bits.
Como resolvemos isso?
DATE
tipo de coluna. Se precisar de maior precisão, use emDATETIME
vez deTIMESTAMP
. Esteja ciente de que asDATETIME
colunas não armazenam informações sobre o fuso horário, portanto, seu aplicativo terá que saber qual fuso horário foi usado.Existem alternativas possíveis para usá-lo, que não representam um problema semelhante?
Sempre que possível, tente usar tipos grandes para armazenar datas em bancos de dados: 64 bits é suficiente - um tipo longo e longo em GNU C e POSIX / SuS, ou
sprintf('%u'...)
em PHP ou na extensão BCmath.Quais são alguns casos de uso potencialmente prejudiciais, embora ainda não estejamos em 2038?
Portanto, um MySQL DATETIME tem um intervalo de 1000-9999, mas TIMESTAMP só tem um intervalo de 1970-2038. Se o seu sistema armazena datas de nascimento, datas futuras de encaminhamento (por exemplo, hipotecas de 30 anos) ou algo semelhante, você já encontrará esse bug. Novamente, não use TIMESTAMP se isso for um problema.
O que podemos fazer com os aplicativos existentes que utilizam o TIMESTAMP, para evitar o chamado problema, quando ele realmente ocorre?
Poucos aplicativos PHP ainda estarão por aí em 2038, embora seja difícil prever, já que a web ainda não é uma plataforma legada.
Aqui está um processo para alterar uma coluna da tabela de banco de dados para converter
TIMESTAMP
paraDATETIME
. Tudo começa com a criação de uma coluna temporária:Recursos
fonte
Ao usar carimbos de data / hora UNIX para armazenar datas, você está, na verdade, usando inteiros de 32 bits, que mantém a contagem do número de segundos desde 01/01/1970; ver hora Unix
Esse número de 32 bits estourará em 2038. Esse é o problema de 2038.
Para resolver esse problema, você não deve usar um timestamp UNIX de 32 bits para armazenar suas datas - o que significa que, ao usar o MySQL, você não deve usar
TIMESTAMP
, masDATETIME
(consulte 10.3.1. Os tipos DATETIME, DATE e TIMESTAMP ):A (provavelmente) melhor coisa que você pode fazer com seu aplicativo para evitar / corrigir esse problema é não usar
TIMESTAMP
, masDATETIME
para as colunas que devem conter datas que não estão entre 1970 e 2038.No entanto, uma pequena observação: há uma grande probabilidade (estatisticamente falando) de que seu aplicativo terá sido reescrito algumas vezes antes de 2038 ^^ Então, talvez, se você não tiver que lidar com datas no futuro , você não terá que cuidar desse problema com a versão atual do seu aplicativo ...
fonte
Uma rápida pesquisa no Google resolverá o problema : problema do ano 2038
fonte
http://en.wikipedia.org/wiki/Year_2038_problem tem a maioria dos detalhes
Em suma:
1) + 2) O problema é que muitos sistemas armazenam informações de data como um int assinado de 32 bits igual ao número de segundos desde 01/01/1970. A última data que pode ser armazenada desta forma é 03:14:07 UTC na terça-feira, 19 de janeiro de 2038. Quando isso acontecer, o int será "agrupado" e armazenado como um número negativo que será interpretado como uma data em 1901. O que acontecerá exatamente varia de sistema para sistema, mas basta dizer que provavelmente não será bom para nenhum deles!
Para sistemas que armazenam apenas datas no passado, acho que você não precisa se preocupar por um tempo! O principal problema são os sistemas que funcionam com datas no futuro. Se o seu sistema precisa funcionar com datas de 28 anos no futuro, você deve começar a se preocupar agora!
3) Use um dos formatos de data alternativos disponíveis ou mude para um sistema de 64 bits e use ints de 64 bits. Ou para bancos de dados, use um formato de carimbo de hora alternativo (por exemplo, para MySQL, use DATETIME)
4) Veja 3!
5) Veja 4 !!! ;)
fonte
Bros, se você precisa usar PHP para exibir carimbos de data / hora, esta é a MELHOR solução PHP sem mudar do formato UNIX_TIMESTAMP.
Use uma função custom_date (). Dentro dele, use o DateTime. Aqui está a solução DateTime .
Contanto que você tenha UNSIGNED BIGINT (8) como seus carimbos de data / hora no banco de dados. Contanto que você tenha o PHP 5.2.0 ++
fonte
Como eu não queria atualizar nada, pedi ao meu backend (MSSQL) para fazer este trabalho ao invés do PHP!
Pode não ser uma maneira eficiente, mas funciona.
fonte