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

Текущая версия

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

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

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

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

Изображение григорианского календаря на марке взято из книги, изданной Иоганном Рашем ещё в 1586 году / Wikimedia Commons
Изображение григорианского календаря на марке взято из книги, изданной Иоганном Рашем ещё в 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 основных дней календаря носил своё собственное имя, связанное с явлением природы, растением или животным. Например: «корова», «ревень» или «морковь». Это было даже оригинально. Представляете, как бы было замечательно, если бы, к примеру, последний день новогодних каникул был «днём хомяка».

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

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

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

Версия СССР

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

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

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

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

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

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

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

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

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

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

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

  • январь, апрель, июль, октябрь — 31, первый день — воскресенье;

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

  • март, июнь, сентябрь, декабрь — 30, первый день — пятница.

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

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

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

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

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

Календари с котиками на 2022 год всё так же популярны
Календари с котиками на 2022 год всё так же популярны

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

Статья была впервые опубликована на другом ресурсе 17 марта 2021.

Комментарии (16)


  1. amarao
    26.12.2021 13:08

    Аргументы "восхитительны".

    Каждый год людям приходится покупать новые календари.

    O rly? Когда вы последний раз покупали календарь? Я вот где-то в районе 1999. Или это был 1997?


    1. shashurup
      26.12.2021 16:00

      Я думаю, любой кто хоть раз писал биллинг с Вами сильно не согласится. Хотя, пожалуй, для обычного бытового использования неудобств совсем немного - тут Вы правы.


      1. HEKOT
        26.12.2021 16:08
        +1

        Или не биллинг, а симулятор движения под микроконтроллер. Просто сделать sec++ и посчитать при этом получившуюся дату уже непросто. А с учетом високосных секунд - невозможно без дополнительного общения с внешним миром.


        1. LordCarCar
          26.12.2021 16:59
          +4

          Посчитать полученную дату сложно?

          Тогда попробуйте посчитать сколько прошло времени между двумя датами, если между ними есть некалендарные дни!!!


      1. amarao
        27.12.2021 12:30

        Я не про сложность календаря, я про аргумент "приходится покупать новые календари". Неужели писатели биллингов покупают себе календари?


        1. shashurup
          27.12.2021 14:30

          А, ну этот, конкретный аргумент, конечно слабоват :)


  1. oleg1977
    26.12.2021 13:12

    В итоге получилось, что новая секунда соответствовала 0,864 старой сесекунды.с

    Сутки длятся 86400 обычных или 200000 французских секунд, то есть французская секунда 0,432 обычной


    1. shedir
      26.12.2021 15:10
      +3

      На самом деле все же 0,864 секунды. Не день, а сутки делились на 10 революционных часов и так далее.


  1. tyomitch
    26.12.2021 15:58
    +4

    Уже было год назад: habr.com/ru/post/530116


  1. pankraty
    26.12.2021 16:22
    +7

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

    (Удивляет, что во всякой космической фантастике продолжают считать время земными единицами; впрочем, я тут не очень начитан)


    1. shashurup
      26.12.2021 17:03
      +5

      ИМХО, привязки к суткам и году, как раз, вполне удобны. Неделя, конечно, вопрос исключительно привычки, хотя и достаточно сильной. А вот, тот же месяц нафиг никому не нужен уже давно. Я бы избавился от него в первую очередь. Правда, как это ни парадоксально, месяца и кварталы как раз очень популярны во всякий учетах и биллингах.

      52 недели + 1 (или 2) вненедельный выходной. Пример даты "15ый вторник 2038 года". Ну и новый год на зимнее солнцестояние снести, чтобы "во дни сомнений, дни тягостных раздумий..." не сильно заморачиваться тем, что мы, все таки, празднуем в каждый "новый год".


    1. Areek
      26.12.2021 17:08
      +3

      Часы и сутки сохраняются в фантастике условно по причине, что именно к таким рамкам привычен организм — их и поддерживает искусственная среда. Столько-то часов сна в сутки…

      Можно сказать, традиционное времяисчисление тянется с планеты и в космос.


      1. pankraty
        26.12.2021 17:16
        +2

        Так ведь есть исследования, что будучи изолированным от внешней среды (например, в пещере), организм имеет тенденцию переходить на удлинённый цикл сна/бодрствования. Там, конечно, много факторов оказывают влияние, но в межзвёздных странствиях нет объективных предпосылок против установления размера цикла в 100 Кс (27:46 на наши деньги). Жаль в СИ не предусмотрено стандартной приставки для 100 000


    1. shedir
      26.12.2021 20:32
      +3

      Секунды с десятичными приставками были у Кенг Хо в «Глубине в небе».


  1. pae174
    26.12.2021 20:44
    +2

    Как быть, например, с днями рождения и другими ежегодными праздниками, привязанными к определённой дате?

    Очень просто - привязать к дням недели. В США, например, днём рождения Мартина Лютера Кинга назначен третий понедельник января. На какое число этот третий понедельник выпадает - не важно.


  1. Caraul
    27.12.2021 14:30
    +3

    Международная служба вращения Земли

    Трутся спиной медведи? :)