Dlaczego dni robocze w programie Excel są nieprawidłowe dla 1900?

27

To pytanie opiera się na spostrzeżeniach AdamV w odpowiedzi na pytanie Jak uzyskać nazwę dnia w komórce w programie Excel?

Gdy A1 ma wartość 2009-08-01, wówczas:

  • =WEEKDAY(A1) otrzymam 7
  • =TEXT(7, "dddd") otrzymam Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd") otrzymam Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd") otrzymam Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd") otrzymam również Sunday, 1900-01-01

Dwa ostatnie są błędne: 1 stycznia 1900 r. To właściwie poniedziałek.
Różne źródła wydają się potwierdzać, że:

czego mi brakuje? Dlaczego Excel robi to źle?

Jeroen Wiert Pluimers
źródło
1
Dzięki temu pytaniu zmieniłem nieco swoją poprzednią odpowiedź, aby wyjaśnić, że 1/1/1900 nie jest niedzielą, ale Excel tak uważa. Niedokładność nie zmienia treści poprzedniej odpowiedzi, a mianowicie, że użycie numeru dnia tygodnia jako podstawy do utworzenia tekstu sformatowanego tak, aby wyglądał jak data, jest wadliwe i niepotrzebne.
AdamV

Odpowiedzi:

40

Jak opisano w Microsoft KB 214058 :

Dni tygodnia przed 1 marca 1900 r. Są niepoprawne w programie Excel

WIĘCEJ INFORMACJI

Kiedy pierwotnie utworzono system dat w Microsoft Excel, zaprojektowano go tak, aby był w pełni kompatybilny z systemami dat używanymi przez inne programy arkuszy kalkulacyjnych.

Jednak w tym systemie dat rok 1900 jest błędnie interpretowany jako rok przestępny. Ponieważ w roku 1900 nie ma 29 lutego („dnia przestępnego”), dzień tygodnia dla dowolnej daty przed 1 marca 1900 r. (Dzień po „dniu przestępnym”) nie został poprawnie obliczony.

„Inne programy do obsługi arkuszy kalkulacyjnych” odnoszą się do Lotusa 1-2-3 , który był wówczas dość popularny i niepoprawnie zakładano, że rok 1900 był rokiem przestępnym. Jest to wyjaśnione bardziej szczegółowo w KB 214326 :

Excel 2000 niepoprawnie zakłada, że ​​rok 1900 jest rokiem przestępnym

WIĘCEJ INFORMACJI

Kiedy Lotus 1-2-3 został wydany po raz pierwszy, program zakładał, że rok 1900 był rokiem przestępnym, chociaż w rzeczywistości nie był to rok przestępny. Ułatwiło to programowi obsługę lat przestępnych i nie zaszkodziło prawie wszystkim obliczeniom dat w Lotus 1-2-3.

Kiedy Microsoft Multiplan i Microsoft Excel zostały wydane, przyjęli również, że 1900 był rokiem przestępnym. To założenie pozwoliło Microsoft Multiplan i Microsoft Excel korzystać z tego samego systemu dat seryjnych, z którego korzysta Lotus 1-2-3 i zapewniać większą kompatybilność z Lotus 1-2-3. Traktowanie 1900 jako roku przestępnego ułatwiło również użytkownikom przenoszenie arkuszy z jednego programu do drugiego.

Chociaż technicznie możliwe jest skorygowanie tego zachowania, aby bieżące wersje programu Microsoft Excel nie zakładały, że 1900 jest rokiem przestępnym, wady takiego rozwiązania przeważają nad zaletami.

Gdyby to zachowanie zostało skorygowane, pojawiłoby się wiele problemów, w tym:

  • Prawie wszystkie daty w bieżących arkuszach Microsoft Excel i innych dokumentach zostałyby zmniejszone o jeden dzień. Korekta tej zmiany zajęłaby sporo czasu i wysiłku, szczególnie w przypadku formuł wykorzystujących daty.
  • Niektóre funkcje, takie jak funkcja WEEKDAY, zwracałyby różne wartości; może to spowodować nieprawidłowe działanie formuł w arkuszach.
  • Poprawienie tego zachowania spowodowałoby przerwanie zgodności daty seryjnej między Microsoft Excel a innymi programami używającymi dat.

Jeśli zachowanie pozostaje nieskorygowane, występuje tylko jeden problem:

  • Funkcja WEEKDAY zwraca niepoprawne wartości dat przed 1 marca 1900 r. Ponieważ większość użytkowników nie używa dat przed 1 marca 1900 r., Ten problem występuje rzadko.
grawitacja
źródło
10
Oto pokrewna historia z Joela Spolsky'ego
mat.
5
Zobacz także . Wielu programistów niepoprawnie zakłada, że ​​praca z datami / godzinami jest łatwa :)
BlueRaja - Danny Pflughoeft 30.09.12
3
Historyczne nitpicK: kiedy mówisz, że 1-2-3 było „dość popularne”, masz na myśli, że kiedyś był to dominujący arkusz kalkulacyjny.
Isaac Rabinovitch
12

Oto powód wyjaśniony przez samego Joela: Mój pierwszy przegląd BillG

Basic używa 31 grudnia 1899 roku jako epoki zamiast 1 stycznia 1900 roku, ale z jakiegoś powodu dzisiejsza data była taka sama w Excelu, jak w Basicu.

Co?

Poszedłem znaleźć programistę Excela, który był wystarczająco dorosły, aby pamiętać, dlaczego. Wydawało się, że Ed Fries zna odpowiedź.

„Och”, powiedział mi. „Sprawdź 28 lutego 1900 r.”

„Jest 59” - powiedziałem.

„Teraz spróbuj 1 marca”.

„Jest 61!”

„Co się stało z 60?” Ed zapytał.

„29 lutego. 1900 był rokiem przestępnym! Można podzielić na 4!”

- Zgaduję, ale nie mam cygara - powiedział Ed i przez chwilę zastanawiałam się.

Ups Zrobiłem trochę badań. Lata, które można podzielić przez 100, nie są latami przestępnymi, chyba że można je również podzielić przez 400.

1900 nie był rokiem przestępnym.

„To błąd w programie Excel!” Wykrzyknąłem.

„Cóż, niezupełnie”, powiedział Ed. „Musieliśmy to zrobić w ten sposób, ponieważ musimy móc importować arkusze Lotus 123”.

„Więc to jest błąd w Lotus 123?”

„Tak, ale prawdopodobnie celowe. Lotus musiał zmieścić się w 640K. To nie jest dużo pamięci. Jeśli zignorujesz 1900, możesz dowiedzieć się, czy dany rok jest rokiem przestępnym, po prostu sprawdzając, czy dwa skrajnie prawe bity są zerowe. To naprawdę szybkie i łatwe. Ludzie z Lotosu prawdopodobnie doszli do wniosku, że to nie miało znaczenia, że ​​myliłem się przez te dwa miesiące w przeszłości.

Giorgi
źródło
1
@JeroenWiertPluimers: Właściwie moja odpowiedź z tym linkiem została usunięta przez moderatora i postanowiłem ją rozwinąć.
Giorgi
2

Jednym z rozwiązań jest dodanie 400 lat do roku, aby wypracować dzień tygodnia, jak w poniższym wzorze = WEEKDAY (DATA (A4 + 400, B4, C4), 1), więc jeśli A4 = 1834 B4 = 12 C4 = 14 zwróci to 1 (niedziela), czyli tyle samo co 14 grudnia 2234. To przestaje działać dla dat sprzed 1753 roku po zmianie kalendarza gregoriańskiego

Adrian
źródło