Чому будні Excel неправильні для 1900 року?


27

Це запитання ґрунтується на спостереженнях AdamV у його відповіді на тему: Як отримати ім’я дня в клітинку в Excel?

Коли A1 має значення 2009-08-01, то:

  • =WEEKDAY(A1) отримаємо 7
  • =TEXT(7, "dddd") отримаємо Saturday
  • =TEXT(7,"dddd, yyyy-mm-dd") отримаємо Saturday, 1900-01-07
  • =TEXT(1,"dddd, yyyy-mm-dd") отримаємо Sunday, 1900-01-01
  • =TEXT("1900-01-01","dddd, yyyy-mm-dd") також отримаємо Sunday, 1900-01-01

Останні два помиляються: 1 січня 1900 року - це фактично понеділок.
Здається, що різні джерела підтверджують:

Що я пропускаю? Чому Excel робить це неправильно?


1
Завдяки цьому питанню я трохи переробив свою попередню відповідь, щоб зрозуміти, що 1/1/1900 - це не неділя, але Excel вважає, що це є. Неточність не змінює суті попередньої відповіді, яка полягає в тому, що використання номера будня як основи для створення тексту, відформатованого таким чином, щоб дати було помилковим та непотрібним.
АдамВ

Відповіді:


40

Як описано в Microsoft KB 214058 :

Дні тижня до 1 березня 1900 року в Excel неправильні

БІЛЬШЕ ІНФОРМАЦІЇ

Коли система дат у Microsoft Excel була створена спочатку, вона була розроблена так, щоб вона була повністю сумісною із системами дат, що використовуються іншими програмами електронних таблиць.

Однак у цій системі дат 1900 рік неправильно трактується як високосний рік. Оскільки в 1900 році немає 29 лютого ("високосний день"), день тижня для будь-якої дати до 1 березня 1900 року (день після "дня стрибка") не обчислюється правильно.

"Інші програми електронних таблиць" відносяться до Лотоса 1-2-3 , який був тоді досить популярним, і неправильно припускали, що 1900 рік був високосним. Це пояснюється ще більш детально в KB 214326 :

Excel 2000 неправильно припускає, що 1900 рік - високосний

БІЛЬШЕ ІНФОРМАЦІЇ

Коли Lotus 1-2-3 був вперше випущений, програма передбачала, що 1900 рік був високосним, хоча насправді це був не високосний рік. Це полегшило програму обробляти високосні роки та не завдало шкоди майже всім розрахункам дат у Lotus 1-2-3.

Коли були випущені Microsoft Multiplan та Microsoft Excel, вони також припустили, що 1900 рік був високосним. Це припущення дозволило Microsoft Multiplan та Microsoft Excel використовувати ту саму систему серійних дат, яку використовує Lotus 1-2-3, та забезпечити більшу сумісність із Lotus 1-2-3. Трактування 1900 року як високосного року також полегшило користувачам переміщення робочих таблиць з однієї програми в іншу.

Хоча технічно можна виправити таку поведінку, щоб сучасні версії Microsoft Excel не вважали, що 1900 рік є високосним, але недоліки цього переважують переваги.

Якщо цю поведінку виправити, виникло б багато проблем, зокрема:

  • Майже всі дати в поточних робочих аркушах Microsoft Excel та інших документах будуть зменшені на один день. Виправлення цієї зміни потребує значних витрат часу та зусиль, особливо у формулах, які використовують дати.
  • Деякі функції, такі як функція WEEKDAY, повертають різні значення; це може призвести до неправильної роботи формул на робочих аркушах.
  • Виправлення цієї поведінки призведе до порушення сумісності серійних дат між Microsoft Excel та іншими програмами, які використовують дати.

Якщо поведінка залишається невиправленою, виникає лише одна проблема:

  • Функція WEEKDAY повертає невірні значення для дат до 1 березня 1900 р. Оскільки більшість користувачів не використовують дати до 1 березня 1900 року, ця проблема є рідкісною.

10
Ось пов’язана історія з власним Джолем
мат

5
Дивіться також . Багато програмістів помилково припускають, що працювати з датами / часом легко :)
BlueRaja - Danny Pflughoeft

3
Історичний nitpicK: якщо ви кажете, що 1-2-3 був "досить популярним", ви маєте на увазі, що колись це була домінуюча електронна таблиця.
Ісаак Рабінович

12

Ось причина, яку пояснив сам Джоел: My First BillG Review

Basic використовує 31 грудня 1899 року як епоху замість 1 січня 1900 року, але чомусь сьогоднішня дата в Excel була такою ж, як і в Basic.

Так?

Я пішов шукати розробника Excel, який був досить дорослим, щоб запам'ятати, чому. Ед Фріз, здавалося, знав відповідь.

"О," сказав він мені. "Виїзд 28 лютого 1900 року."

"Це 59", - сказав я.

"Тепер спробуйте 1 березня."

"Це 61!"

"Що сталося з 60?" - спитав Ед.

"29 лютого. 1900 рік був високосним! Це ділиться на 4!"

- Гарна здогадка, але сигари немає, - сказав Ед і залишив мене на час замислитися.

На жаль Я провів деякі дослідження. Роки, які поділяються на 100, не є високосними, якщо тільки вони не поділяються на 400.

1900 рік не був високосним.

"Це помилка в Excel!" - вигукнув я.

- Ну, не дуже, - сказав Ед. "Ми повинні були зробити це саме так, оскільки нам потрібно мати можливість імпортувати робочі таблиці Lotus 123".

"Отже, це помилка в Lotus 123?"

"Так, але, мабуть, навмисне. Лотосу довелося помістити 640 К. Це не багато пам’яті. Якщо ви проігноруєте 1900, ви зможете зрозуміти, чи є даний рік високосним роком, просто подивившись, чи є два правих біта" нуль. Це дійсно швидко і просто. Хлопці Лотоса, напевно, подумали, що це не має значення для того, щоб пройти два місяці в минулому.


1
@JeroenWiertPluimers: Насправді мою відповідь із цього посилання видалив модератор, і я вирішив розширити свою відповідь.
Джорджі

2

Одне рішення для цього - додати 400 років до року, відпрацювати будній день, як у наступній формулі = ТИЖДЕНЬ (ДАТА (A4 + 400, B4, C4), 1), так що якщо A4 = 1834 B4 = 12 C4 = 14 це поверне 1 (неділя), що те саме, що і 14 грудня 2234 р. Це перестає працювати на дати до 1753 року після зміни грегоріанського календаря

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.