LGPDM

Aller au contenu | Aller au menu | Aller à la recherche

mercredi 18 janvier 2006

Excel vs OpenOffice Calc : Le 16 janvier 1900, un Lundi ou un Mardi ?

Par hasard, j'ai découvert un comportement bizarre sur OpenOffice et Excel.

Rappel : dans ces deux tableurs, les dates sont comptés en nombre de jours depuis une date de référence. Par exemple, OpenOffice compte les jours depuis le 30/12/1899. Aujourd'hui nous sommes au jour n° 38735 (le 18 janvier 2006), un mercredi.

Excel et OpenOfficesont en accord sur :

  • le nombre de jour entre la date initiale et le jour actuel
  • le jour de la semaine de la date actuelle.

Tout semble bien fonctionner SAUF dans certains cas.

Par exemple, au lieu d'avoir une date récente, je vais utiliser une date plus ancienne, le 16 janvier 1900 par exemple.

Dans OpenOffice, si je saisit : 16/1/1900 dans le tableur, la date s'affiche. Si j'affiche le jour uniquement (format personnalisé puis "JJJ"), J'ai un Mardi qui s'affiche. Dans Excel, avec la même manipulation, C'est un Lundi qui s'affiche.

Il y donc dans ce cas un décalage de 1 jour.

Comme il ne peut y avoir qu'une seule bonne réponse, j'ai utilisé Google et la commande "cal 1900". Le résultat est flagrand, Excel a faux, OOo Win ! :

                               1900

       janvier                février                 mars
di lu ma me je ve sa   di lu ma me je ve sa   di lu ma me je ve sa
    1  2  3  4  5  6                1  2  3                1  2  3
 7  8  9 10 11 12 13    4  5  6  7  8  9 10    4  5  6  7  8  9 10
14 15 16 17 18 19 20   11 12 13 14 15 16 17   11 12 13 14 15 16 17
21 22 23 24 25 26 27   18 19 20 21 22 23 24   18 19 20 21 22 23 24
28 29 30 31            25 26 27 28            25 26 27 28 29 30 31

        avril                   mai                   juin
di lu ma me je ve sa   di lu ma me je ve sa   di lu ma me je ve sa
 1  2  3  4  5  6  7          1  2  3  4  5                   1  2
 8  9 10 11 12 13 14    6  7  8  9 10 11 12    3  4  5  6  7  8  9
15 16 17 18 19 20 21   13 14 15 16 17 18 19   10 11 12 13 14 15 16
22 23 24 25 26 27 28   20 21 22 23 24 25 26   17 18 19 20 21 22 23
29 30                  27 28 29 30 31         24 25 26 27 28 29 30

       juillet                 août                 septembre
di lu ma me je ve sa   di lu ma me je ve sa   di lu ma me je ve sa
 1  2  3  4  5  6  7             1  2  3  4                      1
 8  9 10 11 12 13 14    5  6  7  8  9 10 11    2  3  4  5  6  7  8
15 16 17 18 19 20 21   12 13 14 15 16 17 18    9 10 11 12 13 14 15
22 23 24 25 26 27 28   19 20 21 22 23 24 25   16 17 18 19 20 21 22
29 30 31               26 27 28 29 30 31      23 24 25 26 27 28 29
                                              30
       octobre               novembre               décembre
di lu ma me je ve sa   di lu ma me je ve sa   di lu ma me je ve sa
    1  2  3  4  5  6                1  2  3                      1
 7  8  9 10 11 12 13    4  5  6  7  8  9 10    2  3  4  5  6  7  8
14 15 16 17 18 19 20   11 12 13 14 15 16 17    9 10 11 12 13 14 15
21 22 23 24 25 26 27   18 19 20 21 22 23 24   16 17 18 19 20 21 22
28 29 30 31            25 26 27 28 29 30      23 24 25 26 27 28 29
                                              30 31

Pour tout dire, il y a une explication rationnelle à ça. Premièrement, la date de départ des 2 applications n'est pas la même (par défaut) :

  • le 0 Janvier 1900 pour Excel (oui oui, le 0, =annee(0) retourne 1900 et pas 1899)
  • le 30 Décembre 1899 pour OpenOffice.org

(fatigue : je viens de prendre le trognon de pomme sur le bord de la table pour une souris)

La différence au niveau de point de départ permet d'expliquer la différence sur les dates en 1900. Cependant, ça n'explique pas comment au bout d'un certain temps les 2 logiciels fonctionnent de façon identique. Alors, Bug de Excel ? Et bien ... non, ça n'est pas vraiment un bug. C'est une fonctionnalitée choisie par l'éditeur pour garder une compatibilitée avec lotus 123 (qui lui avait le bug), un "By design". Pour être précis, le décalage continue jusqu'au 29 février 1900 (date qui n'a jamais existée, sauf dans lotus 123 et Excel :p).

Du coup, je me pose une question, que je laisserai ouverte pour le moment : dans quelle mesure doit-on garder des éléments de compatibilitée avec d'autres applications ? Peut-on introduire des erreurs de calculs pour des raisons de compatibilitée ?

Edit: un lien vers la "knowledge Base" de microsoft : http://support.microsoft.com/kb/214058/en-us

L'ancêtre de l'écriture W4rl0rd5 ?

Il y a maintenant quelques années, ma grand-mère m'avait montré des cartes postales avec des écriture "bizarres". Une sorte d'écriture composée de lettre et de chiffres, illisible au premier coup d'oeil mais avec une certaine exprience on pouvait lire facilement sans trop chercher ses mots. L'utilisation se faisait principalement sur les cartes postales, on gagne en discrétion (pratique pour les amoureux qui voulaient rester discrets, même si je doute que les parents et le facteur restent dupes très longtemps) et surtout en plaisir de lecture (on fait durer surtout).

On trouve de vieilles cartes postales avec ce genre de code, ma tante en a une de 1904 (sans chercher), ça n'est certainement pas la plus vieille (désolé je n'ai pas de photos pour l'instant).

Rien de mieux qu'un exemple pour m'expliquer :

B48j459 !
J2 8'13 p1s p5 92s3st29 1 6'28v32 d2 72tt92 58 p25 28 p91t3q52
c2 v325x s45v2839 d'28f18c2. 1p92s 1v439 c48t1ct2 71 g918d 7292
p459 q5'2662 72 91f913ch3ss2 58 p25 61 7274392, j2 s53s 28f38
c1p1b62 d'5t363s29 c2 v325x c4d2 ! C1 p94648g2 62 p613s39 d2 62ct592 848 ?
729c3 727292 !

Je vous laisse le soin de découvrir le secret du code :p

Tout ça pour dire que les "w4rl0rd5" et autres l33T sp34k3rs n'ont rien inventé, une simplification du code tout au plus. Pour plus d'information, sur le l33T sp34k, consultez le site dA tRoU dU cULz' hiDEouT, c'est amusant si on connait un peu le milieu (IRC, Linux, script kiddies, informatique en général), pour une information plus précise, rien ne vaut un article de wikipédia que j'ai cherché pour vous. Vous pouvez consulter des sites en les "traduisant" et il existe même une version de Google adaptée !

Pour les plus informaticiens d'entre vous, je n'ai pas pu résister à faire un script pour écrire mon message :

#  -*- coding: utf-8 -*-

chaine = ""

a = []
for i in range(256):
    a.append(chr(i))

a[65] = a[97] = "1"
a[69] = a[101] = "2"
a[73] = a[105] = "3"
a[79] = a[111] = "4"
a[85] = a[117] = "5"
a[76] = a[108] = "6"
a[77] = a[109] = "7"
a[78] = a[110] = "8"
a[82] = a[114] = "9"

a = "".join(a)
print chaine.translate(a)