- · Niveau : INTERMÉDIAIRE
- · Compatibilité : Tous les navigateurs
18 janvier 00, 100, 3900 ou 2000!!!
[Mise à jour avril 2010] On rencontre encore des site ou l’année retournée est 110!
[Mise à jour avril 2004] Et bien, je pensais que c’était réglé depuis le temps, d’ailleurs tant Netscape, la famille Mozilla que IE retourne maintenant une année sur 4 caractères. Mais le nouveau Safari a encore ce bogue, c’est à dire que l’année retournée est 104!
Depuis le 1er janvier 2000 je dois tester et vérifier des dizaines de scripts qui manipulent la date. J’avais bien organiser les choses en utilisant au maximum des scripts Include et volontairement attendues le siècle prochain pour apporter mes modifications. Pourquoi, parce que je ne pouvais quand même pas demander au serveur de changer la date pour faire mes petits tests.
Deux scénarios me trottait dans la tête. Le premier et le plus logique était que la date et en particulier l’année donnée au différent langage seraient 2000. Alors il suffisait d’enlever les diverses manipulations donc le fameux + 1900. Le deuxième était que la date serait 00. Il fallait dans ce cas modifier la manipulation pour ajouter 2000 tout en sachant que le problème restait entier et qu’un jour les systèmes seraient en mesure d’offrir la vraie année et que nous serions obligés de refaire nos scripts.
Et bien qu’elle ne fut pas ma surprise en découvrant que l’année était maintenant 100. Dites-moi où sont allés les milliards de dollars dépensés pour cette cause.
Résultat, l’année en Perl sur serveur UNIX est 100, donc le +1900 fonctionne car miraculeusement 100+1900 = 2000. C’est génial mais jusqu’à quand? À ce sujet lisez le commentaire intéressant de Frederic Hurtubise. Discussion sur Multimédium:
Tu dois savoir que dans le monde UNIX, le temps est compté en nombre de secondes depuis le 31 décembre 1969 à 19h00, heure de Greenwich, soit le 1er janvier 1970 00h00 heure de l’Est. Rendu à une certaine valeur, ce nombre de seconde déborde de la variable (si je ne me trompes pas, soit 16 ou 32 bits) et n’est plus bon. Cette certaine valeur est quelque part en 2038.
Le ASP comme tous produit Windows c’est 2000. Encore une fois est-ce la véritable année ou bien une foutu patche comme seul windows peut nous donner. Je me pose la question parce que le Javascript réagit de deux façons. Tout le monde sait que le Javascript est interprété par le Navigateur et donc par le client.
Le Javascript sous Internet Explorer renvoie l’année 2000 (PC et MAC). Donc j’ai dû enlever le +1900 pour afficher correctement l’année. Mais oups! Netscape affiche 100 (PC et MAC) et ça ne s’arrête pas là, on découvre que Netscape version 4 envoie 0. Il faut tester chaque version. C’est donc dire que l’année 2000 n’est pas au rendez-vous. Est-ce Netscape, Unix, Perl? Est-ce que Windows a fait son travail et que Netscape enlève 1900 à l’année. Qu’est ce qui se passe au juste?.
J’ai communiqué avec plusieurs spécialistes et personne ne peut me répondre. Il semble généralisé que tout le monde ne sait pas vraiment ce qui se passe. Mon travail consiste à utiliser et manipuler les dates offertes par le système via les langages de programmation. C’est facile, on affiche la date et on la manipule pour obtenir le résultat désiré. Plusieurs formats, qu’importe. +x par ci -y par là et le tour est joué. Mais il y a quelque chose qui cloche et je crains fort qu’un jour nos scriptes soient de nouveau sur la table d’opération. C’est ok de travailler un code pour IE et l’autre pour Netscape, les mnémoniques (mot réservé ou fonction et routine) ont un nom différent et leurs utilisations diffèrent. Mais quand il s’agit de la date, de l’année, c’est autre chose. C’est comme si on vivait sur deux planètes…
Conclusion, pour un temps indéterminé, l’année en Javascript est 2000 avec Internet Explorer et 100 avec Netscape. Voici la patche (en bleu) pour ajuster le tout. L’exemple utilise la date de la dernière modification apportée à un fichier.
<script type="text/javascript">
// Fonction
function y2k(number) { return (number < 1000) ? number + 1900 : number; }
// Exemple
dDate=new Date(document.lastModified);
alert(y2k(dDate.getYear()));
</script>