Обложка: Постоянный календарь — мечта программиста

Постоянный календарь — мечта программиста

— Это ты тестировал систему продажи билетов?
— Да…
— Клиент сейчас купил билет на дату «82.13.-891». Либо ты сейчас скажешь ему, сколько дней осталось до поездки, либо переводим тебя на должность стажёра.
(известная шутка с просторов сети)

Проблемы действующего календаря

Нравится ли вам наш календарь? Если вы программист, то, наверное, не очень. Несмотря на то, что во всех современных языках программирования есть удобные инструменты для выполнения действий с временем и датами, работа с календарём остаётся не самой простой задачей, всё время приходится идти на какой-то компромисс.

Например, нам постоянно приходится иметь дело с неравномерными периодами. Если вы 31 марта перешли на новый тариф с ежемесячной оплатой, то какого апреля система должна списывать с вас очередную абонентскую плату? Видимо, 30 апреля. Получается, что дата списания будет меняться каждый месяц. А соединение недельного и месячного планирования в условиях, когда начало нового месяца часто приходится на середину недели? А постоянные поиски какого-нибудь второго четверга месяца? В общем, неудобств хватает даже при наличии необходимых инструментов.

Да и с бытовой точки зрения постоянно меняющийся календарь — вещь довольно неудобная. Каждый год людям приходится покупать новые календари. Конечно, календари по годам периодически повторяются (например, для 2021 года полностью подходят календари на 1993, 1999 и 2010 годы), но хранить пачку пыльных календарей — это чересчур.

Мы с детства привыкли к тому, что в месяцах разное количество дней. К тому же существуют ещё и високосные годы. День недели никак не связан с числом месяца. К этому прибавляются праздники, которые постоянно выпадают на разные дни недели. Из-за этого каждый год правительству приходится придумывать хорошо знакомые всем «переносы» — в праздники некоторые выходные дни становятся буднями, некоторые будни — выходными.

Григорианский календарь

Изображение григорианского календаря на марке взято из книги, изданной Иоганном Рашем ещё в 1586 году / Wikimedia Commons

Чтобы сделать нашу жизнь ещё веселее, существуют разные часовые пояса. Плюс к этому в некоторых странах действует разное летнее и зимнее время, а в некоторых странах его нет. Иногда его вводят или отменяют. Для упрощения придумали понятие всемирного координированного времени UTC. Но, чтобы добавить нам работы, в некоторые годы Международная служба вращения Земли 30 июня или 31 декабря добавляют к этому времени дополнительную секунду. Она ещё называется «високосной». Делают это для того, чтобы всемирное время точнее соответствовало солнечному времени. Так что в такие дни между ’23:59:59′ и ’00:00:00′ есть также и ’23:59:60′.

Скорее всего, при работе с календарными выкладками в какой-нибудь биллинговой или ERP-системе, многих из вас посещала мысль: «А нельзя ли всё это упростить?». Почему бы, например, не придумать такой календарь, в котором количество дней в месяце было бы одинаковым.

Версия египтян

Оказывается, такие идеи уже посещали человечество, и не раз. К примеру, ещё в Древнем Египте действовал календарь, в котором было 12 месяцев, каждый из которых включал в себя ровно 30 дней. Каждый месяц состоял из трёх недель — по 10 дней в каждой. После 30 числа последнего месяца начинался период праздников, которые длились 5 дней. В итоге древнеегипетский год составлял ровно 365 дней. Это, конечно, не самый точный календарь, но всё равно выглядит весьма удобным.

Версия французов

Очередная попытка сделать календарь более систематизированным и периодичным была предпринята после Великой французской революции — в 1793 году. Как и в Древнем Египте год был разделён на 12 месяцев по 30 дней в каждом, а месяц делился на три части — по 10 дней. Кстати, из этих 10 дней выходным был только один! Думаю, это не понравилось бы не только современным программистам, но и людям других профессий. Французы также повторили египетскую методику пяти праздничных дней в конце года (в високосные годы — шесть). Во Франции они не относились ни к какому месяцу и назывались «санкюлотиды».

Интересный факт: каждый из 360 основных дней календаря носил своё собственное имя, связанное с явлением природы, растением или животным. Например: «корова», «ревень» или «морковь». Это было даже оригинально. Представляете, как бы было замечательно, если бы, к примеру, последний день новогодних каникул был «днём хомяка».

А вот в чём французы пошли дальше египтян, так это в измерении времени. По новым правилам сутки делились на 20 часов (по 10 часов на день и на ночь), час — на 100 минут, минута — на 100 секунд.

Циферблат времён Французской революции

Так выглядит циферблат времён Французской революции/ Wikimedia Commons

Десятичная система в действии! В итоге получилось, что новая секунда соответствовала 0,864 старой секунды. Представляете, как было бы удобно программировать такое время? Но для французов в 1793 году это, конечно, было уже слишком. Одно дело напечатать новые календари, и совсем другое — переделывать все часы. В 1806 году Наполеон отменил и новый календарь, и новую систему измерения времени.

Версия СССР

Знаете ли вы, какая страна была следующей в этой череде экспериментов? Многих удивит этот факт, но в СССР с 1 октября 1929 года действовал так называемый Советский революционный календарь. Теоретически он должен был быть построен по уже знакомой нам схеме — 12 месяцев по 30 дней, в конце года — 5 праздников. Кстати, они должны были иметь свои названия: День Ленина, два Дня Труда и два Индустриальных дня.

На практике же новый календарь использовался одновременно с традиционным, григорианским. В нём в месяцах сохранялось привычное число дней, но отсутствовали некоторые дни года: 22 января, 1 и 2 мая (май начинался сразу с третьего числа), 7 и 8 ноября, 5 декабря.

Изображение советского календаря

В календаре 1931 года обозначены только дни пятидневной недели, число дней в месяцах сохранилось / Wikimedia Commons

Конечно, эти дни никуда не исчезли, они оставались в «параллельном» григорианском календаре. Всё дело в том, что новый календарь фактически являлся табелем с пятидневными рабочими неделями. Один из них был выходной. Перечисленные дни тоже были выходными и в рабочие недели не входили. С 21 ноября 1931 этот календарь был частично отменён — в неделе стало 6 дней. Выходные приходились на 6, 12, 18, 24 и 30 число каждого месяца.

В итоге на практике получился очень странный календарь, в котором ещё больше всё запуталось. Фактически параллельно действовало два календаря — традиционный и рабочий. Теоретический вариант был более стройным и понятным. Окончательно СССР вернулся к традиционному календарю только 26 июня 1940 года. Любопытно, что после этого несколько лет неделя в СССР начиналась с воскресенья.

Календарь Гильбурда

Существовал ещё один очень похожий проект постоянного календаря — так называемый «Календарь Гильбурда». Этот календарь был предложен в 1969 году. В нём было 12 месяцев, в каждом месяце — пять шестидневных недель. Оставшиеся 5 или 6 выходных дней добавлялись не в конец года, а по одному к последней неделе каждого чётного месяца. Из-за этого получалось, что некоторые недели становились семидневными. Зато количество рабочих дней в месяце в этом календаре было бы постоянным. Автор календаря Яков Гильбурд предлагал внедрить его с 1 января 2001 года.

Другие проекты

В книге главного астронома Парижской обсерватории Поля Кудера «Календарь» приведено ещё два варианта реформы нашего привычного григорианского календаря.

Первый вариант — так называемый «неподвижный календарь»: год состоит из 13 месяцев, в каждом из которых 28 дней (4 недели). В начале года есть вненедельный выходной день. В високосные годы добавляется ещё один выходной день — в середине года. Правда, 13 — число несчастливое. Кроме того, в этом проекте был ряд других проблем. Как быть, например, с днями рождения и другими ежегодными праздниками, привязанными к определённой дате?

Второй вариант — менее радикальный. Он условно назывался «всемирный календарь». Этот календарь был очень похож на наш григорианский. Например, в нём было разное количество дней в разных месяцах:

  • январь, апрель, июль, октябрь — 31, первый день — воскресенье;
  • февраль, май, август, ноябрь — 30, первый день — среда;
  • март, июнь, сентябрь, декабрь — 30, первый день — пятница.

Первый день года был выходным и не входил ни в один из месяцев. Високосный день должен был добавляться каждые четыре года после 30 июня.

Во «всемирном календаре» сохранялись те же проблемы, что и в григорианском: месяц не состоял из целого количества недель, количество дней в месяцах — разное. Зато в нём было и несколько преимуществ. Во-первых, этот календарь должен был стать постоянным и не менялся бы каждый год. Во-вторых, количество рабочих дней во всех месяцах было бы одинаковым — 26. Можно сказать, что этот вариант был наиболее компромиссным из всех.

Эксперименты провалились

Поль Кудер писал: «Люди настолько привыкли к своему календарю, что их не смущает его неправильность, и они даже не подозревают о бесчисленных проблемах, которые он создаёт в экономической и социальной жизни». Автор, правда, высказывал некоторые сомнения в практической реализуемости реформы календаря. Вспомним, например, метрическую систему, на которую перешёл весь мир, кроме США, Либерии и Мьянмы. Наверняка, с новым календарём было бы то же самое. Слишком уж это сложная задача — внедрять что-то новое в масштабах всей нашей планеты.

Книга Поля Кудера была написана в 1946 году. Мы с вами, живущие в 2021 году, видим, что все проекты нового календаря так и остались проектами или непродолжительными экспериментами. В программировании мы вынуждены использовать специальные инструменты для работы с датами и временем, без подсказки не можем точно сказать, на какой день недели приходится определённая дата, а для дома каждый год по-прежнему покупаем новые календари с котиками.

Напишите, были ли в вашей практике сложные или забавные случаи работы с календарём. Устраивает ли вас непостоянный календарь? Хотелось бы вам его поменять?


А вот как программисты сами придумывают и решают задачи, связанные с календарём: например, одной математической формулой по номеру месяца считают количество дней в нём.

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.

Перейти к регистрации