
Коллега сказал мне: «С 01.01.1900 прошло ровно 43871 день». Сегодня 10.02.2020.
Я хотел проверить это с помощью PowerShell, но получил другой результат:
PS C:\Windows\system32> New-TimeSpan ([datetime]"01.01.1900") (Get-Date)
Days : 43869
Hours : 11
Minutes : 15
Seconds : 46
Milliseconds : 304
Так что я был сбит с толку, потому что разница была в 2 дня. Поэтому я спросил у Google всемогущего:
Как видите, Google также сообщает, что прошло 43869 дней, а не 43871.
Поэтому я спросил своего друга, как он это вычислил. Он сделал это в Excel, отформатировав ячейку в dateonly
. Когда он затем пишет int
в ней , Excel преобразует ее в дату, например
15641
становится27.10.1942
19874
становится30.05.1954
43869
становится08.02.2020
(?)43871
становится10.02.2020
(?)
Excel живет на 2 дня впереди нас или почему он думает, что с 01.01.1900 прошло на 2 дня больше, чем на самом деле? Он что-то упускает?
Вот небольшая гифка (к сожалению, на немецком, так как у меня немецкий Excel):
решение1
Почему:
Во-первых, ваш друг и Google ведут расчеты по-разному. Excel (использующий систему дат 1900 года) считает, что с 1900 года есть только один дополнительный день.
Excel хранит даты в виде последовательных чисел, где 1-Jan-1900
= 1
и 10-Feb-2020
-->43871
Такдней с тех порпо Excel должно быть 43871
- 1
-->43870
Однако расчет Excel неверен.
Когда появился Excel, Lotus123 была ведущей программой для работы с электронными таблицами.
У Lotus 123 была ошибка, из-за которой он считал 1900 год високосным.
Для совместимости в связи с конкуренцией Excel включил эту ошибку. Однако, поскольку 29-Feb-1900
это несуществующая дата, другие методы покажут, правильно, 43869
при вычитании двух дат.
Кстати, Excel VBA также правильно рассчитывает разницу дат -->43869
решение2
Microsoft Excel поддерживает две разные системы дат. Это система дат 1900 и система дат 1904.
Система дат 1900 года
В системе дат 1900 первым поддерживаемым днем является 1 января 1900 года. При вводе даты она преобразуется в порядковый номер, представляющий количество прошедших дней, начиная с 1 для 1 января 1900 года. Например, если ввести 5 июля 1998 года, Excel преобразует дату в порядковый номер 35981. По умолчанию Microsoft Excel для Windows использует систему дат 1900. Система дат 1900 обеспечивает лучшую совместимость между Excel и другими программами для работы с электронными таблицами, такими как Lotus 1-2-3, которые предназначены для работы под управлением MS-DOS или Microsoft Windows.
Система дат 1904 года
В системе дат 1904 года первым поддерживаемым днем является 1 января 1904 года. Когда вы вводите дату, она преобразуется в серийный номер, представляющий количество прошедших дней с 1 января 1904 года, начиная с 0 для 1 января 1904 года. Например, если вы вводите 5 июля 1998 года, Excel преобразует дату в серийный номер 34519. Из-за конструкции ранних компьютеров Macintosh даты до 1 января 1904 года не поддерживались. Такая конструкция была предназначена для предотвращения проблем, связанных с тем, что 1900 год не был високосным. Раньше Excel для Macintosh по умолчанию использовал систему дат 1904 года для рабочих книг, созданных на Macintosh. Однако теперь Excel для Macintosh по умолчанию использует систему дат 1900 года и поддерживает даты с 1 января 1900 года.
Разница между системами дат
Поскольку две системы дат используют разные начальные дни, одна и та же дата представлена разными серийными номерами в каждой системе дат. Например, 5 июля 1998 года может иметь два разных серийных номера, как показано ниже.
Date system Serial number of July 5, 1998
1900 date system 35981
1904 date system 34519
Источник: https://docs.microsoft.com/en-us/office/troubleshoot/excel/1900-and-1904-date-system