J'ai marqué ce document comme étant un wiki communautaire, alors n'hésitez pas à le modifier à votre guise.
Quel est exactement le problème de l'année 2038 ?
"Le problème de l'année 2038 (également connu sous le nom de bogue du millénaire d'Unix, Y2K38 par analogie avec le problème de l'an 2000) peut entraîner la défaillance de certains logiciels informatiques avant ou pendant l'année 2038. Le problème affecte tous les logiciels et systèmes qui stockent l'heure du système sous la forme d'un nombre entier 32 bits signé, et interprètent ce nombre comme le nombre de secondes depuis 00:00:00 UTC le 1er janvier 1970."
Pourquoi cela se produit-il et que se passe-t-il quand cela se produit ?
Temps au-delà 03:14:07 UTC le mardi 19 janvier 2038 sera "enveloppé" et stocké en interne comme un nombre négatif, que ces systèmes interpréteront comme un temps au 13 décembre 1901 plutôt qu'en 2038. Cela est dû au fait que le nombre de secondes écoulées depuis l'époque UNIX (1er janvier 1970 00:00:00 GMT) aura dépassé la valeur maximale d'un ordinateur pour un entier signé de 32 bits.
Comment le résoudre ?
Existe-t-il des alternatives possibles à son utilisation, qui ne posent pas un problème similaire ?
Essayez autant que possible d'utiliser de grands types pour stocker les dates dans les bases de données : 64 bits sont suffisants - un type long long dans GNU C et POSIX/SuS, ou encore sprintf('%u'...)
en PHP ou dans l'extension BCmath.
Quels sont les cas d'utilisation potentiellement innovants, même si nous ne sommes pas encore en 2038 ?
Donc, un MySQL DATETIME a une plage de 1000-9999, mais TIMESTAMP n'a qu'une plage de 1970-2038. Si votre système stocke des dates de naissance, des dates futures à terme (par exemple, des hypothèques sur 30 ans) ou autres, vous rencontrerez déjà ce problème. Encore une fois, n'utilisez pas TIMESTAMP si cela risque de poser problème.
Que pouvons-nous faire aux applications existantes qui utilisent TIMESTAMP, pour éviter le soi-disant problème, lorsqu'il se produit réellement ?
Peu d'applications PHP existeront encore en 2038, bien qu'il soit difficile de le prévoir car le web n'est pas encore une plate-forme héritée.
Voici une procédure pour modifier une colonne de table de base de données pour la convertir TIMESTAMP
à DATETIME
. Cela commence par la création d'une colonne temporaire :
# rename the old TIMESTAMP field
ALTER TABLE `myTable` CHANGE `myTimestamp` `temp_myTimestamp` int(11) NOT NULL;
# create a new DATETIME column of the same name as your old column
ALTER TABLE `myTable` ADD `myTimestamp` DATETIME NOT NULL;
# update all rows by populating your new DATETIME field
UPDATE `myTable` SET `myTimestamp` = FROM_UNIXTIME(temp_myTimestamp);
# remove the temporary column
ALTER TABLE `myTable` DROP `temp_myTimestamp`
Ressources