Warum sind Excel-Wochentage für 1900 falsch?

27

Diese Frage stützt sich auf die Beobachtungen von AdamV im seine Antwort auf Wie bekomme ich den Tagnamen in eine Zelle in Excel?

Wenn A1 den Wert 2009-08-01 hat, dann:

  • =WEEKDAY(A1) wird erhalten 7
  • =TEXT(7, "dddd") wird erhalten Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd") wird erhalten Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd") wird erhalten Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd") werde auch erhalten Sunday, 1900-01-01

Die letzten beiden sind falsch: Der 1. Januar 1900 ist eigentlich ein Montag.
Verschiedene Quellen scheinen das zu bestätigen:

Was vermisse ich? Warum macht Excel das falsch?

Jeroen Wiert Pluimers
quelle
1
Dank dieser Frage habe ich meine vorherige Antwort leicht umformuliert, um klar zu machen, dass der 1.1.1900 kein Sonntag ist, aber Excel denkt, dass dies der Fall ist. Die Ungenauigkeit ändert nichts an der Substanz dieser vorherigen Antwort, das heißt, dass die Verwendung einer Wochentagsnummer als Grundlage für die Erstellung von Text, der wie ein Datum formatiert ist, fehlerhaft und unnötig ist.
AdamV

Antworten:

40

Wie bei Microsoft beschrieben KB 214058 :

Wochentage vor dem 1. März 1900 sind in Excel falsch

MEHR INFORMATIONEN

Als das Datumssystem in Microsoft Excel ursprünglich erstellt wurde, wurde es so konzipiert, dass es vollständig mit Datumssystemen kompatibel ist, die von anderen Tabellenkalkulationsprogrammen verwendet werden.

In diesem Datumssystem wird das Jahr 1900 jedoch falsch als Schaltjahr interpretiert. Da es keinen 29. Februar ("Schalttag") im Jahr 1900 gibt, wird der Wochentag für ein beliebiges Datum vor dem 1. März 1900 (der Tag nach dem "Schalttag") nicht richtig berechnet.

Die "anderen Tabellenkalkulationsprogramme" beziehen sich auf Lotus 1-2-3 , was damals sehr beliebt war und zu Unrecht davon ausgegangen ist, dass das Jahr 1900 ein Schaltjahr war. Dies wird in noch ausführlicher erläutert KB 214326 :

Excel 2000 nimmt fälschlicherweise an, dass das Jahr 1900 ein Schaltjahr ist

MEHR INFORMATIONEN

Als Lotus 1-2-3 erstmals veröffentlicht wurde, ging das Programm davon aus, dass das Jahr 1900 ein Schaltjahr war, obwohl es eigentlich kein Schaltjahr war. Dies machte es für das Programm einfacher, Schaltjahre zu meistern, und fast alle Datumsberechnungen in Lotus 1-2-3 wurden nicht beschädigt.

Als Microsoft Multiplan und Microsoft Excel veröffentlicht wurden, nahmen sie auch an, dass 1900 ein Schaltjahr war. Diese Annahme erlaubte Microsoft Multiplan und Microsoft Excel, dasselbe serielle Datumssystem zu verwenden, das von Lotus 1-2-3 verwendet wird, und eine bessere Kompatibilität mit Lotus 1-2-3 zu bieten. Wenn Sie 1900 als Schaltjahr behandeln, ist es für Benutzer auch einfacher, Arbeitsblätter von einem Programm zum anderen zu verschieben.

Obwohl es technisch möglich ist, dieses Verhalten so zu korrigieren, dass aktuelle Versionen von Microsoft Excel nicht davon ausgehen, dass es sich bei 1900 um ein Schaltjahr handelt, überwiegen die Nachteile.

Wenn dieses Verhalten korrigiert werden würde, würden viele Probleme auftreten, einschließlich der folgenden:

  • Fast alle Daten in aktuellen Microsoft Excel-Arbeitsblättern und anderen Dokumenten würden um einen Tag verringert. Das Korrigieren dieser Verschiebung würde vor allem in Formeln, die Datumsangaben verwenden, viel Zeit und Mühe erfordern.
  • Einige Funktionen, wie die WEEKDAY-Funktion, würden andere Werte zurückgeben. Dies kann dazu führen, dass Formeln in Arbeitsblättern falsch funktionieren.
  • Das Korrigieren dieses Verhaltens würde die Kompatibilität der seriellen Daten zwischen Microsoft Excel und anderen Programmen, die Daten verwenden, beeinträchtigen.

Wenn das Verhalten nicht korrigiert wird, tritt nur ein Problem auf:

  • Die WEEKDAY-Funktion gibt falsche Werte für Datumsangaben vor dem 1. März 1900 zurück. Da die meisten Benutzer keine Datumsangaben vor dem 1. März 1900 verwenden, ist dieses Problem selten.
grawity
quelle
9
Hier ist eine verwandte Geschichte von Joel Spolsky von Stack Exchange: joelonsoftware.com/items/2006/06/16.html
matt
4
Siehe auch . Viele Programmierer gehen fälschlicherweise davon aus, dass das Arbeiten mit Datum und Uhrzeit einfach ist :)
BlueRaja - Danny Pflughoeft
2
Historical nitpicK: Wenn Sie sagen, 1-2-3 sei "ziemlich beliebt", meinen Sie, es war einmal die dominierende Tabelle.
Isaac Rabinovitch
12

Hier ist der Grund, den Joel selbst erklärt hat: Mein erster BillG Review

Basic verwendet den 31. Dezember 1899 als Epoche anstelle des 1. Januar 1900   aus irgendeinem Grund war das heutige Datum in Excel das gleiche wie in   Basic.

Huh?

Ich ging zu einem Excel-Entwickler, der alt genug war, um sich daran zu erinnern, warum.   Ed Fries schien die Antwort zu kennen.

"Oh", sagte er mir. "Check out 28. Februar 1900."

"Es ist 59", sagte ich.

"Versuchen Sie es jetzt am 1. März."

"Es ist 61!"

"Was ist mit 60 passiert?" Fragte Ed.

"29. Februar. 1900 war ein Schaltjahr! Es ist durch 4 teilbar!"

"Gute Vermutung, aber keine Zigarre", sagte Ed und ließ mich nach einer Frage fragen   während.

Hoppla. Ich habe etwas recherchiert. Jahre, die durch 100 teilbar sind, sind dies nicht   Schaltjahre, es sei denn, sie sind auch durch 400 teilbar.

1900 war kein Schaltjahr.

"Es ist ein Fehler in Excel!" Rief ich aus

"Nun, nicht wirklich", sagte Ed. "Wir mussten es so machen, weil wir es brauchen   Lotus 123-Arbeitsblätter importieren zu können. "

"Also ist es ein Fehler in Lotus 123?"

"Ja, aber wahrscheinlich absichtlich. Lotus musste 640K passen."   Das ist nicht viel Speicher. Wenn Sie 1900 ignorieren, können Sie herausfinden, ob   Ein gegebenes Jahr ist ein Schaltjahr, wenn man nur nach dem Rechtesten sucht   zwei Bits sind null. Das geht wirklich schnell und einfach. Die Lotus Jungs   Wahrscheinlich dachte er, es sei egal, auf zwei Monaten falsch zu sein   in der Vergangenheit.

Giorgi
quelle
1
@JeroenWiertPluimers: Eigentlich wurde meine Antwort mit diesem Link vom Moderator gelöscht und ich beschloss, meine Antwort zu erweitern.
Giorgi
1

Eine Lösung hierfür besteht darin, das Jahr um 400 Jahre zu verlängern, um den Wochentag wie in der folgenden Formel zu berechnen = WOCHENTAG (DATUM (A4 + 400, B4, C4), 1) also wenn A4 = 1834 B4 = 12 C4 = 14 dies würde 1 (Sonntag) zurückgeben Dies ist das gleiche wie für den 14. Dezember 2234 Dies gilt für Datumsangaben vor 1753 im Jahr nach der Änderung des Gregorianischen Kalenders

Adrian
quelle