Perles de Mongueurs (48)
Article publié dans Linux Magazine 126, avril 2010.
- Index
La perle de ce mois-ci a été rédigée par Philippe "BooK" Bruhat (book@mongueurs.net
), de Lyon.pm et Paris.pm.
Perl et le bug de 2038
Sous Unix, les dates sont stockées sous forme d'un nombre entier de secondes, comptées depuis l'epoch (date arbitrairement fixée à 1970-01-01 00:00:00 GMT
). Sur les systèmes où cet entier est un entier signé de 32 bits, cela limite le nombre de secondes à 2 ** 31 - 1
, soit 2 147 483 647 secondes. Autrement dit, 19 janvier 2038 à 3 h 14 min 7 s temps universel, le système se croira le 13 décembre 1901.
Mais le problème ne se posera pas seulement dans un peu moins de trente ans. Beaucoup de monde utilise le système basé sur l'epoch pour représenter des dates dans le futur. Et il est des applications qui s'intéressent à des dates 30 ans dans le futur (au hasard, les prêts bancaires).
Les développeurs de Perl sont très attentifs à ce genre de problèmes de compatibilité. C'est pourquoi Michael Schwern a écrit le module Time::y2038
, qui fournit des versions des fonctions internes de Perl (gmtime()
, localtime()
, timegm()
, timelocal()
) compatibles avec des dates post-2038.
Cependant, pour Time::y2038
, les contraintes de réutilisation des dates sont un peu plus fortes, car le module doit tenir compte des fuseaux horaires, en particulier pour tenir compte des horaires d'été, très variables suivants les régions du monde.
Pour une année donnée après 2038, le module va sélectionner la dernière année correspondante dans le calendrier de 28 ans prédéfini. Pour que deux années se correspondent, il faut non seulement :
-
qu'elles commencent le même jour de la semaine,
-
qu'elles aient toutes deux le même nombre de jour en février,
mais il faut également :
-
que les années précédentes se correspondent, afin que lorsqu'on fait des calculs de date le premier janvier avec un fuseau horaire pré-UTC, le 31 décembre corresponde également,
-
que l'année suivante commence le même jour de la semaine, quand on fait des calculs le 31 décembre avec un fuseau horaire post-UTC.
Dans le second cas, l'état bissextile ou non n'a pas d'importance, car on s'intéresse seulement au premier janvier. Ce mécanisme est suffisant efficace pour permettre de travailler avec des dates allant jusqu'après 2400 (modulo les bases de locales qui ne seront pas à jour).
À noter que le code C derrière ce module Perl a été repris d'un code déjà existant, amélioré et retouché pour être rendu portable, permettant ainsi aux auteurs d'autres projets projets libres de le réutiliser librement.
Références
-
http://fr.wikipedia.org/wiki/Bogue_de_l%27an_2038 - Page Wikipédia sur le bug de 2038.
-
http://search.cpan.org/dist/Time-y2038/ - Le module
Time::y2038
. -
http://code.google.com/p/y2038/ - Projet sur Google fournissant le code C
-
http://www.courtois.cc/humour/y2k.html - Page collectant d'autres bugs similaires au bug de l'an 2000 et de 2038.
Copyright © Les Mongueurs de Perl, 2001-2011 pour le site.
Les auteurs conservent le copyright de leurs articles.
(http://articles.mongueurs.net/magazines/perles/perles-48.html)
Aucun commentaire:
Enregistrer un commentaire