Horodatage, problème de l'année 2038 pour le système Ubuntu 64 bits

24

J'utilise un système Ubuntu 64 bits.

Je travaille actuellement sur un projet qui intègre MariaDB. Je prévois d'introduire une technique d'horodatage dans le projet afin que les gens reçoivent l'heure correcte pour différents fuseaux horaires.

J'ai entendu et lu quelques articles sur le problème de l'année 2038 pour l'horodatage. De nombreux articles suggèrent que nous utilisons un système 64 bits pour gagner un peu plus de temps.

À combien de temps ce «bit» fait-il référence? Est-il assez long pour que nous puissions gérer les applications Web jusqu'à la fin? Si ce n'est pas le cas, est-ce comme une prolongation de seulement deux ans, alors quand l'année 2040 arrivera, allons-nous avoir des applications qui ne fonctionnent pas correctement?

tet
la source
27
Les systèmes 64 bits utilisant des time_tentiers 64 bits vous donneront un peu plus de temps - jusqu'à 15h30:08 le dimanche 4 décembre 292 277 026 596. J'espère que c'est assez long pour votre candidature;)
Ron
4
Cela ne vous en donne pas un peu plus. Il vous donne exactement 32 bits de plus.
user12205
5
Les horodatages 64 bits sont une autre de ces mesures d'interruption. Qu'en est-il des personnes travaillant sur le projet Utopia dans 100 000 000 000 000 CE? Ils vont aussi avoir besoin de systèmes informatiques fonctionnels! L'utilisation d'horodatages 128 bits nous permettrait d'identifier de manière unique à tout moment non seulement cette itération de l'univers, mais bien d'autres encore.
Blacklight Shining
1
Comme vous n'avez encore jamais accepté de réponses sur ce site: Si l'une des réponses ci-dessous vous a aidé, n'oubliez pas de cliquer sur le gris à gauche de son texte, ce qui signifie Oui, cette réponse est valable ! ;-)
Fabby

Réponses:

34

Eh bien, s'il existe une option pour acheter littéralement un "bit", c'est-à-dire le transfert d'un entier 32 bits signé vers un entier 32 bits non signé, les choses continuent de fonctionner en 2106.

Le transfert en 64 bits est "un peu mieux". Vous obtenez des centaines de milliards d'années de résolution.

Et Ubuntu fait ceci:

$ uname -p
x86_64

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

Cependant, c'est le niveau du système d'exploitation. Ce n'est pas parce qu'Ubuntu utilise un entier 64 bits pour son temps que MySQL / MariaDB l'utilisera pour stocker ses horodatages. Si les dates après 2038 sont importantes pour vous maintenant, commencez immédiatement les tests.

En fait, je peux vous faire gagner du temps. C'est encore cassé. Ce bogue a été signalé il y a plus de dix ans, mais son test principal échoue toujours avec un int 64 bits.

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

Ce n'est même pas du stockage. C'est un peu pathétique.

(Et oui, cela a été exécuté sur MariaDB, version 10.1)

Oli
la source
8
10 ans plus tard, ils ont encore 22 ans pour le réparer. <
Croise les
4
NB: L'utilisation d'entiers 32 bits non signés est un hack .
Kevin
6

Ne le stockez pas du tout comme un entier. Stockez-le en tant que chaîne de date au format ISO 8601 . Il s'agit du format standard utilisé sur Internet.

9999-12-31T23:59:59+00:00
dobey
la source
17
Levons tous un verre au bug Year10K! ;) Mais sérieusement, bien que les chaînes soient vraiment extensibles, elles sont relativement énormes (votre exemple est 200bits!) Et l'analyse et la manipulation des nombres primitifs sont des milliards de fois plus rapides. C'est important.
Oli
6
C'est un excellent format d'affichage - et pour cela seulement. Pour toute autre chose (c'est-à-dire gérer les données jusqu'au dernier moment où vous décidez de les formater à l'utilisateur), comme comparer, faire de l'arithmétique, etc., l'horodatage Unix en tant qu'entier (ou flottant) est beaucoup mieux.
egmont
1
@Oli C'est important, si c'est vraiment important. Cette solution n'échoue pas lorsqu'il y a des temps plus anciens que l'époque UNIX. Le format est la norme utilisée pour les dates partout sur Internet, dans les protocoles et les API. Si vous stockez quelque chose dans une colonne MariaDB, c'est vraiment ainsi que vous devez le stocker sur le disque. Bien sûr, en mémoire, vous voudrez peut-être le stocker dans une structure de données plus adaptée. Et vous n'avez pas besoin des 40 derniers bits si vous utilisez toujours UTC.
dobey