Pourquoi les jours de semaine Excel sont-ils erronés pour 1900?

27

Cette question est basée sur les observations d' AdamV dans sa réponse sur Comment puis-je obtenir le nom du jour dans une cellule dans Excel?

Lorsque A1 a la valeur 2009-08-01, alors:

  • =WEEKDAY(A1) obtiendra 7
  • =TEXT(7, "dddd") obtiendra Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd") obtiendra Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd") obtiendra Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd") obtiendra également Sunday, 1900-01-01

Les deux derniers se trompent: le 1er janvier 1900 est en fait un lundi.
Diverses sources semblent confirmer que:

Qu'est-ce que je rate? Pourquoi Excel fait-il cela mal?

Jeroen Wiert Pluimers
la source
1
Grâce à cette question, j'ai légèrement reformulé ma réponse précédente pour préciser que le 1/1/1900 n'est pas un dimanche, mais Excel le pense. L'inexactitude ne change pas le fond de cette réponse précédente qui est que l'utilisation d'un numéro de jour de semaine comme base pour produire du texte formaté pour ressembler à une date est erronée et inutile.
AdamV

Réponses:

40

Comme décrit dans Microsoft KB 214058 :

Les jours de la semaine avant le 1er mars 1900 sont incorrects dans Excel

PLUS D'INFORMATION

Lorsque le système de date dans Microsoft Excel a été créé à l'origine, il a été conçu pour être entièrement compatible avec les systèmes de date utilisés par d'autres programmes de feuille de calcul.

Cependant, dans ce système de dates, l'année 1900 est incorrectement interprétée comme une année bissextile. Puisqu'il n'y a pas de 29 février («jour bissextile») en l'an 1900, le jour de la semaine pour toute date antérieure au 1er mars 1900 (le lendemain du «jour bissextile») n'est pas calculé correctement.

Les «autres programmes de feuille de calcul» se réfèrent à Lotus 1-2-3 , qui était assez populaire à l'époque, et supposait à tort que l'année 1900 était une année bissextile. Ceci est expliqué plus en détail dans KB 214326 :

Excel 2000 suppose à tort que l'année 1900 est une année bissextile

PLUS D'INFORMATION

Lorsque Lotus 1-2-3 a été publié pour la première fois, le programme supposait que l'année 1900 était une année bissextile, même si ce n'était en fait pas une année bissextile. Cela a permis au programme de gérer plus facilement les années bissextiles et n'a causé aucun préjudice à presque tous les calculs de date dans Lotus 1-2-3.

Lorsque Microsoft Multiplan et Microsoft Excel ont été lancés, ils ont également supposé que 1900 était une année bissextile. Cette hypothèse a permis à Microsoft Multiplan et Microsoft Excel d'utiliser le même système de date de série utilisé par Lotus 1-2-3 et d'offrir une meilleure compatibilité avec Lotus 1-2-3. Le fait de traiter 1900 comme une année bissextile a également permis aux utilisateurs de déplacer plus facilement les feuilles de calcul d'un programme à l'autre.

Bien qu'il soit techniquement possible de corriger ce comportement afin que les versions actuelles de Microsoft Excel ne supposent pas que 1900 est une année bissextile, les inconvénients de cette opération l'emportent sur les avantages.

Si ce comportement devait être corrigé, de nombreux problèmes se poseraient, notamment les suivants:

  • Presque toutes les dates des feuilles de calcul Microsoft Excel actuelles et d'autres documents seraient réduites d'une journée. Corriger ce changement demanderait beaucoup de temps et d'efforts, en particulier dans les formules qui utilisent des dates.
  • Certaines fonctions, telles que la fonction WEEKDAY, renverraient des valeurs différentes; cela peut entraîner un mauvais fonctionnement des formules dans les feuilles de calcul.
  • La correction de ce comportement romprait la compatibilité des dates de série entre Microsoft Excel et d'autres programmes qui utilisent des dates.

Si le comportement reste non corrigé, un seul problème se produit:

  • La fonction WEEKDAY renvoie des valeurs incorrectes pour les dates antérieures au 1er mars 1900. Étant donné que la plupart des utilisateurs n'utilisent pas de dates antérieures au 1er mars 1900, ce problème est rare.
grawity
la source
10
Voici une histoire connexe de Joel Spolsky, le propriétaire de Stack Exchange: joelonsoftware.com/items/2006/06/16.html
matt
5
Voir aussi . De nombreux programmeurs supposent à tort que travailler avec des dates / heures est facile :)
BlueRaja - Danny Pflughoeft
3
NitpicK historique: quand vous dites que 1-2-3 était "assez populaire", vous voulez dire que c'était autrefois le tableur dominant.
Isaac Rabinovitch
12

Voici la raison expliquée par Joel lui-même: My First BillG Review

Basic utilise le 31 décembre 1899 comme époque au lieu du 1er janvier 1900, mais pour une raison quelconque, la date d'aujourd'hui était la même dans Excel que dans Basic.

Hein?

Je suis allé trouver un développeur Excel qui était assez vieux pour se rappeler pourquoi. Ed Fries semblait connaître la réponse.

"Oh," me dit-il. "Départ le 28 février 1900."

"C'est 59," dis-je.

"Maintenant, essayez le 1er mars."

"C'est 61!"

"Qu'est-il arrivé à 60?" Demanda Ed.

"Le 29 février. 1900 était une année bissextile! Elle est divisible par 4!"

"Bonne supposition, mais pas de cigare", a déclaré Ed, et m'a laissé me demander pendant un moment.

Oops. J'ai fait des recherches. Les années divisibles par 100 ne sont pas des années bissextiles, sauf si elles sont également divisibles par 400.

1900 n'était pas une année bissextile.

"C'est un bug dans Excel!" M'exclamai-je.

"Eh bien, pas vraiment", a déclaré Ed. "Nous avons dû procéder de cette façon car nous devons pouvoir importer des feuilles de calcul Lotus 123."

"Alors, c'est un bug dans Lotus 123?"

"Ouais, mais probablement intentionnel. Lotus devait tenir dans 640K. Ce n'est pas beaucoup de mémoire. Si vous ignorez 1900, vous pouvez déterminer si une année donnée est une année bissextile juste en regardant pour voir si les deux bits les plus à droite sont zéro. C'est vraiment rapide et facile. Les gars de Lotus ont probablement pensé que cela n'avait pas d'importance de se tromper pendant ces deux mois.

Giorgi
la source
1
@JeroenWiertPluimers: En fait, ma réponse avec ce lien a été supprimée par le modérateur et j'ai décidé d'élargir ma réponse.
Giorgi
2

Une solution à cela consiste à ajouter 400 ans à l'année, à travailler le jour de la semaine comme dans la formule suivante = WEEKDAY (DATE (A4 + 400, B4, C4), 1) donc si A4 = 1834 B4 = 12 C4 = 14 cela retournerait 1 (dimanche) qui est le même que pour le 14 décembre 2234 Cela cesse de fonctionner pour les dates avant 1753 l'année après le changement du calendrier grégorien

Adrian
la source