68 votes

Que devons-nous faire pour nous préparer à 2038 ?

J'aime à penser que certains des logiciels que j'écris aujourd'hui seront utilisés dans 30 ans. Mais je suis également conscient qu'une grande partie de ces logiciels est basée sur la tradition UNIX d'exposer le temps comme le nombre de secondes depuis 1970.

#include <stdio.h>
#include <time.h>
#include <limits.h>

void print(time_t rt) {
    struct tm * t = gmtime(&rt);
    puts(asctime(t));
}

int main() {
    print(0);
    print(time(0));
    print(LONG_MAX);
    print(LONG_MAX+1);
}

L'exécution a pour résultat :

  • Thu Jan 1 00:00:00 1970
  • Sat Aug 30 18:37:08 2008
  • Mar Jan 19 03:14:07 2038
  • Fri Dec 13 20:45:52 1901

Les fonctions ctime(), gmtime() et localtime() prennent toutes comme argument une valeur de temps représentant le temps en secondes depuis l'époque (00:00:00 UTC, 1er janvier 1970 ; voir time(3) ).

Je me demande s'il y a quelque chose de proactif à faire dans ce domaine en tant que programmeur, ou devons-nous croire que tous les systèmes logiciels (alias systèmes d'exploitation) seront d'une manière ou d'une autre magiquement mis à jour dans le futur ?

Mise à jour Il semblerait que les systèmes 64 bits soient effectivement à l'abri de ce problème :

import java.util.*;

class TimeTest {
    public static void main(String[] args) {
        print(0);
        print(System.currentTimeMillis());
        print(Long.MAX_VALUE);
        print(Long.MAX_VALUE + 1);
    }

    static void print(long l) {
        System.out.println(new Date(l));
    }
}
  • Wed Dec 31 16:00:00 PST 1969
  • Sat Aug 30 12:02:40 PDT 2008
  • Sat Aug 16 23:12:55 PST 292278994
  • Sun Dec 02 08:47:04 PST 292269055

Mais qu'en est-il de l'année 292278994 ?

2 votes

Vous seriez heureux si vous étiez présent pour être tenu responsable d'un accident de cette année-là, n'est-ce pas ?

33 votes

Ne vous inquiétez pas pour l'année 292278994. La plupart des systèmes tombent en panne à l'année 2147483647.

5 votes

Je pense que vous nous avez convaincus - nous devons passer à 128 bits immédiatement !

50voto

Schwern Points 33677

J'ai écrit un remplacement portable pour time.h (actuellement juste localtime(), gmtime(), mktime() et timegm()) qui utilise le temps 64 bits même sur des machines 32 bits. Il est destiné à être déposé dans les projets C en remplacement de time.h. Il est utilisé en Perl et j'ai l'intention de corriger les problèmes 2038 de Ruby et Python avec lui également. Cela vous donne une marge de sécurité de +/- 292 millions d'années.

Vous pouvez trouver le code au projet y2038 . N'hésitez pas à poser vos questions à la gestionnaire de problèmes .

Pour ce qui est du "ce ne sera pas un problème avant 29 ans", lisez ceci liste des réponses standard à ça. En bref, des choses se passent dans le futur et parfois il faut savoir quand. J'ai aussi une présentation du problème, ce qui n'est pas une solution, et ce qui est .

Oh, et n'oubliez pas que de nombreux systèmes temporels ne gèrent pas les dates antérieures à 1970. Des choses se sont passées avant 1970, parfois vous avez besoin de savoir quand.

4 votes

@Schwern : Aussi, septembre 1752 est un mois avec moins de 28 jours. Connaissance de niche grâce au programmeur pragmatique. genealogytoday.com/colonnes/everyday/030902.html

2 votes

Dave Oh ho, cela dépend de votre localité ! Seuls les Britanniques et leurs possessions sont passés au grégorien en 1752. Les autres l'ont fait en 1582 jusqu'au 20ème siècle (Europe de l'Est, Chine, Turquie, Russie). ncal -p pour une liste et fr.wikipedia.org/wiki/Gregorian_calendar#Adoption pour l'histoire complète. Il n'y a pas non plus d'année 0... sauf si vous parlez à un astronome. J'espère que vous n'aurez jamais à faire face à la conversion julienne/grégorienne.

0 votes

@pm100 : "Le contrôle de source pour ce projet a été déplacé vers github et utilise maintenant git." : github.com/schwern/y2038

19voto

Kasprzol Points 2954

Vous pouvez toujours mettre en œuvre RFC 2550 et soyez en sécurité pour toujours ;-)

L'univers connu a un passé et un futur finis. L'âge actuel de l'univers l'univers est estimé dans [Zebu] entre 10 ** 10 et 2 * 10 ** 10 ans. 10 ans. La mort de l'univers est estimée par [Nigel] comme se produisant dans 10 ** 11 - ans et dans [Drake] qu'elle se produira soit dans 10 ** 12 ans pour un univers fermé (le big crunch) ou 10 ** 14 ans pour un univers ouvert (la mort thermique de l'univers). ouvert (la mort thermique de l'univers).

Les programmes conformes à la norme Y10K PEUVENT choisir de limiter la gamme des dates qu'ils qu'ils prennent en charge à celles qui correspondent à la durée de vie prévue de l'univers. Les systèmes compatibles Y10K DOIVENT accepter des dates Y10K allant de 10 ** 12 ans dans le passé à 10 ** 20 ans dans le futur. 12 ans dans le passé à 10 ** 20 ans dans le futur. Les systèmes conformes à la norme Y10K DEVRAI accepter des dates pour au moins 10 ** 29 ans dans le passé et le futur.

3 votes

C'est la seule solution durable que j'ai vue jusqu'à présent.

4 votes

Ah, mais ce n'est que le estimé l'âge de l'univers. Si cette estimation est un peu fausse, nous aurons de gros problèmes !

5 votes

La seule véritable solution consiste à stocker le temps en unités de temps de Plank jusqu'au moment où tous les protons et neutrons se seront évaporés, soit environ 1e40 ans, ce qui nécessitera un peu plus de 256 bits pour le stocker. Mais comme la désintégration des protons est encore une hypothèse et que le nombre exact n'est pas connu, il faut pousser jusqu'à 512 bits, juste pour être sûr. mail.pm.org/pipermail/pdx-pm-list/2010-septembre/005952.html

4voto

hamishmcn Points 3486

Pour quelques réflexions sur la question, voir cette page

4voto

Rob Walker Points 25840

Visual Studio est passé à une représentation 64 bits de time_t dans Visual Studio 2005 (tout en laissant _time32_t pour la rétrocompatibilité).

Tant que vous prenez soin de toujours écrire le code en termes de time_t et de ne rien présumer de la taille, alors, comme le souligne sysrqb, le problème sera résolu par votre compilateur.

3 votes

Leurs implémentations de localtime() et gmtime() ne fonctionnent pas avant 1970 et échouent en l'an 3001. Voir code.google.com/p/y2038/wiki/AmazingDiscoveries

1voto

Martin Brown Points 8593

Je pense que nous devrions laisser le bug en place. Ensuite, vers 2036, nous pourrons commencer à vendre des services de conseil pour de grosses sommes d'argent afin de tout tester. Après tout, n'est-ce pas ainsi que nous avons réussi à gérer le retournement de 1999-2000 ?

Je plaisante !

J'étais assis dans une banque à Londres en 1999 et j'ai été assez étonné de voir un consultant commencer à tester la machine à café pour le passage à l'an 2000. Je pense que si nous avons appris quelque chose de ce fiasco, c'est que la grande majorité des logiciels fonctionneront tout simplement et que la plupart des autres ne provoqueront pas d'effondrement en cas de défaillance et pourront être réparés après coup si nécessaire. En tant que tel, je ne prendrais pas de précautions particulières avant que le moment ne soit venu, à moins que vous n'ayez affaire à un logiciel très critique.

9 votes

Le passage à l'an 2000 n'a pas été un problème parce que les gens s'y sont préparés. La préparation a nécessité beaucoup de travail. La grande majorité des logiciels n'ont pas seulement fonctionné, ils ont été examinés et peut-être corrigés. Le reste n'a pas provoqué d'effondrement parce qu'il n'y en avait pas tant que ça.

2 votes

David a raison. Les entreprises qui ont pris le problème du passage à l'an 2000 au sérieux ont procédé à un examen approfondi de pratiquement tous leurs systèmes. Les problèmes ont été trouvés et corrigés. Dans le cadre d'un petit système non critique, nous avons résolu trois problèmes qui auraient tous entraîné une perte de données s'ils n'avaient pas été corrigés.

0 votes

Soyons clairs, je ne dis pas que nous ne devons rien faire. Je pense simplement que nous pouvons tester beaucoup moins de systèmes que ne le suggèrent les consultants et que les politiques générales du type "nous devons tout tester" sont excessives. Tenons-nous en aux systèmes critiques pour cette fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X