Registro de data e hora, problema do ano 2038 para o sistema Ubuntu de 64 bits

24

Estou usando o sistema Ubuntu de 64 bits.

Atualmente, estou trabalhando em um projeto que incorpora o MariaDB. Estou planejando introduzir a técnica de registro de data e hora no projeto para que as pessoas recebam a hora correta para diferentes fusos horários.

Ouvi e li alguns artigos sobre o problema do ano 2038 para o registro de data e hora. Muitos artigos sugerem que usamos um sistema de 64 bits para comprar um pouco mais de tempo.

A quanto tempo esse "bit" se refere? É tempo suficiente para podermos gerenciar aplicativos da web até o final? Se não for esse o caso, é como uma extensão de apenas dois anos e, quando chegar o ano 2040, teremos aplicativos que não funcionarão adequadamente?

tet
fonte
27
Os sistemas de 64 bits que usam time_tnúmeros inteiros de 64 bits fornecerão um pouco mais de tempo - até 15:30:08 no domingo, 4 de dezembro, 292.277.026.596. A esperança é o tempo suficiente para a sua aplicação;)
Ron
4
Não lhe dá um pouco mais. Dá a você exatamente 32 bits a mais.
User12205 18/09/2015
5
O registro de data e hora de 64 bits é outra dessas medidas de interrupção. E as pessoas que trabalham no Projeto Utopia em 100.000.000.000.000 de CE? Eles vão precisar de sistemas de computadores funcionais também! O uso de carimbos de data e hora de 128 bits nos permitiria identificar a qualquer momento, não apenas dessa iteração do universo, mas de muitas outras.
Blacklight Shining
1
Como você nunca aceitou nenhuma resposta antes neste site: Se uma das respostas abaixo o ajudou, não se esqueça de clicar no cinza à esquerda do texto, o que significa Sim, esta resposta é válida ! ;-)
Fabby

Respostas:

34

Bem, se houver uma opção para literalmente comprar um "bit", ou seja, transferir de um número inteiro de 32 bits assinado para um número inteiro de 32 bits não assinado, as coisas continuam funcionando no 2106.

Transferir para 64 bits é "um pouco melhor". Você tem centenas de bilhões de anos de resolução.

E o Ubuntu faz isso:

$ uname -p
x86_64

$ date --date=9090-01-01 +%s
224685532800

No entanto, esse é o nível do sistema operacional. Só porque o Ubuntu usa um número inteiro de 64 bits para seus tempos não significa que o MySQL / MariaDB o usará para armazenar seus registros de data e hora. Se as datas anteriores a 2038 forem importantes para o seu agora, comece o teste imediatamente.

Na verdade, posso poupar algum tempo. Ainda está quebrado. Esse bug foi relatado há mais de uma década, mas seu teste principal ainda falha com um int de 64 bits.

mysql> select from_unixtime(2548990800);
+---------------------------+
| from_unixtime(2548990800) |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0.00 sec)

Isso nem é armazenamento. É um pouco patético.

(E sim, isso foi executado no MariaDB, versão 10.1)

Oli
fonte
8
10 anos atrás, eles ainda têm 22 anos para consertá-lo. <Crosses fingers> ...
Mindwin 17/09/2015
4
Nota: O uso de números inteiros de 32 bits não assinados é um hack .
Kevin
6

Não o armazene como um número inteiro. Armazene-o como uma string de data formatada ISO 8601 . Este é o formato padrão usado na Internet.

9999-12-31T23:59:59+00:00
dobey
fonte
17
Vamos todos levantar um copo para o bug do Year10K! ;) Mas, falando sério, embora as strings sejam realmente extensíveis, elas são relativamente grandes (seu exemplo é 200 bits!) E a análise e manipulação de números primitivos é um bazilhão de vezes mais rápido. Aquilo importa.
Oli
6
Este é um ótimo formato para exibição - e apenas para isso. Para qualquer outra coisa (isto é, manipular os dados até o último momento em que você decide formatá-los para o usuário), como comparar, fazer aritmética etc. o registro de data e hora do Unix como um número inteiro (ou float) é muito melhor.
egmont
1
@ Oli Importa, se realmente importa. Esta solução não falha quando há momentos anteriores à época do UNIX. O formato é o padrão usado para datas em toda a Internet, em protocolos e APIs. Se você estiver armazenando algo em uma coluna do MariaDB, na verdade, é como você deve armazená-lo em disco. Claro, na memória, talvez você queira armazená-lo em uma estrutura de dados mais acessível. E você não precisa dos últimos 40 bits se você sempre usa o UTC.
Dobey 18/09/15