И немного про необходимость общего образования для технарей
Представьте себя на месте молодого балбеса в начале 80-х. В голове Sex Pistols, пиво и девчонка, которая улыбнулась тебе в баре. Каким бы ты ни был умным, тебе явно не до тонкостей календарных вычислений в средние века.
И, кстати, Википедия появится через пару десятков лет, а у тебя явно нет страсти к библиотечным посиделкам допоздна.
И вот подходит к тебе босс, который отвечает за создание продукта, который впоследствии перевернёт мир и говорит: «А придумай-ка, как будут работать в нашем новом программном продукте даты». Ты умён и можешь программировать. Что тут сложного? В году 365 дней, 12 месяцев, почти половина содержит 30 дней, и почти половина — 31 день. И придуман февраль, самый противный месяц в году, в котором 28 дней. Но Земля крутится вокруг Солнца не ровное количество дней, поэтому для компенсации придумали каждые 4 года добавлять один день в году к февралю и называют тот год високосным. «Так же?» — спрашивает он у своего начальника представляя, как прекрасно работает его программа. «Так!» — отвечает его начальник, такой же молодой балбес.
И невдомёк им, что во всём человеческом есть хитрости. А чтобы эти хитрости знать, надо не только быть умным, но и любить книжки читать.
Так вот, я рассказал вам про юлианский календарь, который действовал до 15 октября 1582 года, когда его сменил римский папа Григория XIII своим указом. А отличается он от своего предшественника, введённого аж Юлием Цезарем одной маленькой особенностью. Високосные года, которые имеют в окончании номера года два нуля (…, 1800, 1900, …) високосными не являются. Но вот те, которые делятся на 400 (1600 и 2000) — такие же високосные, как и прочие те, которые просто на 4 делятся (…, 2020, 2024, …). И это я такой умный, потому что у меня Википедия есть, и я «кризис миллениума» пережил.
А у тех молодых балбесов только Sex Pistols и пиво с девчонками в голове.
Так что они спокойно внедрили алгоритм работы с датами в свой революционный продукт и забыли об этом на почти 15 лет.
Да, отдельное «спасибо» надо сказать тому плохому учителю истории, который у молодого балбеса не смог вызвать любви к изучению прошлого. Придумав гениальную идею о том, что все даты надо просто пронумеровать, он взял в качестве отправной точки … начало 20 века. Первым днём в Excel является 1 января 1900 года. Ибо жил этот балбес в 20-м веке, а кому в столь прогрессивное время интересны Наполеон и Иван Грозный, Юлий Цезарь и папа Григорий XIII? Правильно, никому. Вот поэтому нет отрицательных дат в электронных таблицах и нет возможности историкам выполнять вычисления с датами для более ранних периодов.
Вы уже устали читать, а это лишь преамбула. Я про это всё рассказываю на своих курсах. И писать статью не было бы смысла. Но вот основной текст.
Первый факт
1900 год не был високосным. Это значит, что 29 февраля в нём не было. Но это не было известно авторам системы нумерации дат и поэтому в Excel такая дата существует. Можно было бы такой же нудный фильм снять как советский про 31 июня, только про 29 февраля 1900 года.
Так что по-настоящему правильным календарь в Excel является лишь с 1 марта 1900 года. Я прямо не знаю, как вы с этим фактом будете теперь жить.
Факт второй
Но нас же ждёт 2100 год. И настоящий кризис тысячелетия будет тогда, когда какой-нибудь старый компьютер, который управляет забытым датчиком на усыплённой атомной станции или почти списанной ракете посчитает, что есть 29 февраля 2100 года и выдаст ошибку в результате которой управляющая программа даст сбой и …
Поэтом предпринимались попытки переписать этот ошибочный алгоритм и в различных около-экселевских средах действуют другие правила.
Например, в Power Query, который является неотъемлемым дополнением к классическому Excel, отрицательные даты есть. Power Query создавали всё-таки не панки и об истории и христианской религии какие-то сведения у них были. Самым первым днём в PQ является день под номером -693593 и это… 1 января 0001 года … по григорианскому календарю. Хотя на тот день в Римской Империи действовал юлианский. Но тут уже совсем можно сдвинуться.
Факт третий
В зависимости, какую среду вы будете использовать, нумерация дат до 1 марта 1900 года будет у вас отличаться. В Excel 1 — это 1 января 1900 года, а в Power Query этот день обозначен номером 2.
Впрочем, также нумеруются даты в надстройке Power Pivot, но, правда, там тоже нет отрицательных дат, так что глубокие исторические расчёты в нём невозможны.
Какой алгоритм используют наши «отечественные» аналоги?
Р7-таблицы работают по алгоритму, который действует в классическом Excel: 1 — это 1 января 1900 года, отрицательных дат нет.
LibreOffice — по алгоритму, который похож на тот, что зашит в Power Query. Там есть отрицательные даты и у них мир начался вместе с Христом на - 693597 день от начала отсчёта. Примечательно, что у LibreOffice алгоритм даёт расхождение с Power Query на 2 дня.
Факт четвёртый
Программисты счёт ведут не с 1, как нормальные люди, а с 0, поэтому отрицательных дат в Excel нет, но есть нулевая дата. И она разная. У Power Query и Power Pivot это 30 декабря 1899 года, а у самого Excel есть нулевое(!) января 1900 года.
Как с этим всем жить? Вроде бы — забить и забыть. Собственно, так и живут все люди. 2100-й год далеко. Пусть внуки думают об этом. Мы же хотим, чтобы они жили весело и им было чем заниматься!
И зря радуются фанаты Excel, что даты там пронумерованы до 31 декабря 9999 года. Правильный алгоритм перестанет быть правильным 28 февраля 2100 года. Всего через 70 с небольшим лет. Но за это время или Excel умрёт или случится что-то, что будет важнее этого «небольшого казуса».
А нам стоит помнить, на каком основании построена современная цифровая цивилизация и как важно технарям давать общее универсальное образование. Ведь могли создать вечный продукт. Но не вышло.