Je pensais utiliser TIMESTAMP pour stocker la date et l'heure, mais j'ai lu qu'il y avait une limitation de l'année 2038 dessus. Au lieu de poser ma question en gros, j'ai préféré la diviser en petites parties pour qu'elle soit également facile à comprendre pour les utilisateurs novices. Donc ma (mes) question (s):
- Quel est exactement le problème de l'an 2038?
- Pourquoi cela se produit-il et que se passe-t-il quand cela se produit?
- Comment pouvons-nous le résoudre?
- Existe-t-il des alternatives possibles à son utilisation, qui ne posent pas un problème similaire?
- Que pouvons-nous faire aux applications existantes qui utilisent TIMESTAMP, pour éviter le soi-disant problème, quand il se produit vraiment?
Merci d'avance.
Réponses:
J'ai marqué ceci comme un wiki communautaire, alors n'hésitez pas à le modifier à votre guise.
Quel est exactement le problème de l'an 2038?
"Le problème de l'année 2038 (également connu sous le nom de bogue Unix Millennium, l'an 2000 par analogie avec le problème de l'an 2000) peut entraîner l'échec de certains logiciels avant ou pendant l'année 2038. Le problème affecte tous les logiciels et systèmes qui stockent l'heure système sous la forme d'un 32 -bit integer et interpréter 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?
Les heures au-delà de 03:14:07 UTC le mardi 19 janvier 2038 «s'enrouleront» et seront stockées en interne sous la forme d'un nombre négatif, que ces systèmes interpréteront comme une heure du 13 décembre 1901 plutôt qu'en 2038. Cela est dû à le fait que le nombre de secondes 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 pouvons-nous le résoudre?
DATE
type de colonne. Si vous avez besoin d'une précision plus élevée, utilisezDATETIME
plutôt queTIMESTAMP
. Attention, lesDATETIME
colonnes ne stockent pas d'informations sur le fuseau horaire, votre application devra donc savoir quel fuseau horaire a été utilisé.Existe-t-il des alternatives possibles à son utilisation, qui ne posent pas un problème similaire?
Essayez dans la mesure du possible d'utiliser de grands types pour stocker des dates dans des bases de données: 64 bits suffit - un type long long en GNU C et POSIX / SuS, ou
sprintf('%u'...)
en PHP ou l'extension BCmath.Quels sont les cas d'utilisation potentiellement cassants même si nous ne sommes pas encore en 2038?
Ainsi, un DATETIME MySQL a une plage de 1000 à 9 999, mais TIMESTAMP n'a qu'une plage de 1970 à 2038. Si votre système stocke les dates de naissance, les dates futures futures (par exemple, les hypothèques à 30 ans) ou similaire, vous allez déjà rencontrer ce bogue. Encore une fois, n'utilisez pas TIMESTAMP si cela pose un problème.
Que pouvons-nous faire aux applications existantes qui utilisent TIMESTAMP, pour éviter le soi-disant problème, quand il se produit vraiment?
Peu d'applications PHP seront encore disponibles en 2038, bien qu'il soit difficile de prévoir que le Web n'est pas encore une plate-forme héritée.
Voici un processus pour modifier une colonne de table de base de données pour convertir
TIMESTAMP
àDATETIME
. Cela commence par la création d'une colonne temporaire:Ressources
la source
Lorsque vous utilisez des horodatages UNIX pour stocker des dates, vous utilisez en fait un nombre entier de 32 bits, qui tient compte du nombre de secondes depuis le 01/01/1970; voir l' heure Unix
Ce nombre de 32 bits débordera en 2038. C'est le problème de 2038.
Pour résoudre ce problème, vous ne devez pas utiliser un horodatage UNIX 32 bits pour stocker vos dates - ce qui signifie que lorsque vous utilisez MySQL, vous ne devez pas utiliser
TIMESTAMP
, maisDATETIME
(voir 10.3.1. Les types DATETIME, DATE et TIMESTAMP ):La meilleure chose (probablement) que vous puissiez faire à votre application pour éviter / résoudre ce problème est de ne pas utiliser
TIMESTAMP
, maisDATETIME
pour les colonnes qui doivent contenir des dates qui ne sont pas comprises entre 1970 et 2038.Une petite note, cependant: il y a une très grande probabilité (statistiquement parlant) que votre candidature ait été réécrite plusieurs fois avant 2038 ^^ Alors peut-être, si vous n'avez pas à vous occuper de dates dans le futur , vous n'aurez pas à vous occuper de ce problème avec la version actuelle de votre application ...
la source
Une recherche rapide sur Google fera l'affaire: problème de l'année 2038
la source
http://en.wikipedia.org/wiki/Year_2038_problem contient la plupart des détails
En résumé:
1) + 2) Le problème est que de nombreux systèmes stockent les informations de date sous la forme d'un entier signé 32 bits égal au nombre de secondes depuis le 1/1/1970. La dernière date qui peut être stockée de cette manière est 03:14:07 UTC le mardi 19 janvier 2038. Lorsque cela se produit, l'int "s'enroule" et est stocké comme un nombre négatif qui sera interprété comme une date en 1901. Ce qui se passera alors exactement varie d'un système à l'autre, mais il suffit de dire que ce ne sera probablement pas bon pour aucun d'entre eux!
Pour les systèmes qui ne stockent que des dates dans le passé, alors je suppose que vous n'avez pas à vous inquiéter pendant un moment! Le principal problème est avec les systèmes qui fonctionnent avec des dates dans le futur. Si votre système doit fonctionner avec des dates de 28 ans dans le futur, vous devriez commencer à vous inquiéter maintenant!
3) Utilisez l'un des formats de date alternatifs disponibles ou passez à un système 64 bits et utilisez des entiers 64 bits. Ou pour les bases de données, utilisez un autre format d'horodatage (par exemple pour MySQL, utilisez DATETIME)
4) Voir 3!
5) Voir 4 !!! ;)
la source
Bros, si vous avez besoin d'utiliser PHP pour afficher les horodatages, c'est la MEILLEURE solution PHP sans changer du format UNIX_TIMESTAMP.
Utilisez une fonction custom_date (). À l'intérieur, utilisez le DateTime. Voici la solution DateTime .
Tant que vous avez UNSIGNED BIGINT (8) comme horodatage dans la base de données. Tant que vous avez PHP 5.2.0 ++
la source
Comme je ne voulais rien mettre à jour, j'ai demandé à mon backend (MSSQL) de faire ce travail au lieu de PHP!
Ce n'est peut-être pas un moyen efficace, mais cela fonctionne.
la source