Добрый день, коллеги! Совсем недавно решил выложить в общий доступ свой маленький проект, связанный с определением выходного дня (очень не хватает слова «выхoдность», т.е. принадлежность к выходному дню). Мне это понадобилось, когда я составлял план срочных бэкапов и их переливки из одного офиса в другой, дабы не тревожить пользователей в рабочие дни.

Основная суть проекта проста — в 1-2 строки кода узнать выходной день или нет.

Пока возможно проверять только 1 день, только для России и начиная с 2010 года (кстати, полный список загруженных годов и стран, можно узнать тут).

Для проверки, например, 24 июля 2017 года, необходимо и достаточно:

curl https://isdayoff.ru/20170724
0

Ответ 0, а это значит будний день. Подобным образом можно проверить любой день в этом и предыдущих годах. Если будет задана некорректная дата, то ответ будет 100.

Почему не выбрать аналоги?


В процессе решения проблемы, я рассматривал аналоги, наиболее яркие из всех, это http://basicdata.ru/api/calend/ и http://xmlcalendar.ru/

1. Слишком (слишком-слишком) много информации (приходится парсить, на bash это делать сложно — проще просто получить готовый ответ от сервиса)
2. А где https?

TODO


  1. Добавить ещё стран (хотя бы ex-USSR страны)
  2. Добавить форматы для вывода JSON/XML/YAML
  3. Добавить расширенный режим

Послесловие


Я буду очень рад, если у сервиса прибавится пользователей (разумеется, это повлияет на скорость разработки и добавления фич) и всегда рад пообщаться в Telegram и по почте andrey@esin.name
Поделиться с друзьями
-->

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


  1. Varfalomey
    24.07.2017 16:55

    Выходной день это вместе с праздниками? Если нет, то чем не устраивает обычный расчет Юлианская дата? А если да, то насколько можно доверять по заполнению праздничных дней по СНГ?


    1. Varfalomey
      24.07.2017 17:03

      Upd: нарыл еще такой сервис http://api1.vasha-ats.ru/daytype.php?date=2017-07-22
      Как понимаю, совпадает с вашим по функционалу


      1. Lertmind
        24.07.2017 19:58

        Там только за 2016 и 2017 годы. Хотя уже есть за 2018 год.


      1. la_stik
        24.07.2017 22:08

        Спасибо, но опять же, нельзя сократить до простейшего ответа в 1 или 0 (но это моё мнение и сервис писал именно с этим учётом)


    1. la_stik
      24.07.2017 22:07

      Да, всё верно. Выходной, это праздники и прочее, несколько позже добавлю сокращённые дни.
      В данный момент, только РФ. (Обязуюсь добавить в ближайшее время другие страны). Данные берутся из указов МинТруда и сверяются с Консультант+ и Гарант.


  1. vasechka
    24.07.2017 17:59
    +1

    (кстати, полный список загруженных годов и стран, можно узнать тут).

    404 ошибка на https://isdayoff.ru/db.


    Но, если честно, web-сервис для определения выходного это какой-то перебор. Я пользуюсь numpy.is_busday и это одна строчка + определение календаря, если мне нужно добавить какие-то специфические календари, типа когда была открыта биржа или что-то еще. Вот это и есть одна-две строчки.


    1. la_stik
      24.07.2017 22:03
      +1

      За 404 дико извиняюсь. Восстановил

      Но, если честно, web-сервис для определения выходного это какой-то перебор.

      CalaaS (Calendar-as-a-Service, только что придумал). Вы пишите на python, как понимаете, возможностей достаточно много и можно подключить любые библиотеки, тот же bash имеет несколько больше ограничений, поэтому простое curl… и сервис на стороне часто спасает.


      1. vasechka
        24.07.2017 22:44

        ладно, уговорили.


        тогда где возможность выбора календаря? (знаю, что сейчас один, но, скажем, добавите вы туда выходные в украине или сша — как выбрать?)


        1. la_stik
          24.07.2017 23:30

          В данный момент вижу 2 пути:


          1. Просто параметр cc (с кодом страны из ISO) после даты — наверно, самое простое
          2. Использование поддомена вместо параметра (короче на целых 3 символа) — и в плане балансировки этот способ интереснее


  1. den_golub
    24.07.2017 19:29

    Э-э-э-э. Извините конечно, но определять выходной день или нет можно просто, делением и проверкой возврата?
    И делается это скриптом написанном на коленке, единственная проблема прикрутить все праздники для разных стран, хотя это вопрос времени, парсить их потихоньку и добавлять.

    А где https?

    собственно сервису проверки даты он нужен, как козе рукав.
    Добавить форматы для вывода JSON/XML/YAML

    Вот это правильно, но все же если апи то излишне, каждый сам может обработать ответ в нужном виде, если только забирать с сервиса список выходных за год, но зачем?

    Добавить расширенный режим

    Можно поподробнее что туда будет входить?

    И к слову а почему 22 декабря 2222 это некорректная дата?


    1. x0wl
      24.07.2017 19:45

      Вы не учитываете переноса выходных в связи с праздниками. Алгоритмом этот перенос посчитать невозможно, потому что он определяется волей левой пятки Минтруда.


      Год некорректный скорее всего потому, что для него пока ещё не опубликован трудовой календарь.


    1. la_stik
      24.07.2017 21:59

      Э-э-э-э. Извините конечно, но определять выходной день или нет можно просто, делением и проверкой возврата?
      И делается это скриптом написанном на коленке, единственная проблема прикрутить все праздники для разных стран, хотя это вопрос времени, парсить их потихоньку и добавлять.


      Как ответили чуть ниже, праздники (в частности в РФ, примерно летом МинТруд обозначает приказом), угадать — невозможно, а в целом это и есть некая цель — прикрутить праздники и выходные разных государств, как и написал в TODO

      Вот это правильно, но все же если апи то излишне, каждый сам может обработать ответ в нужном виде, если только забирать с сервиса список выходных за год, но зачем?

      Как говорится, на вкус и цвет, все фломастеры разные, мне удобно работать с plain данными, т.к. работаю из bash, я более чем уверен, что есть люди, которым проще скормить кусок JSON, и работать как с объектом. Это уже как по накатанной.

      Можно поподробнее что туда будет входить?

      Во-первых, самое простое — это возврат предпраздничного дня (код ответа 2), во-вторых, чуть расширеннее возврат данных, полная дата и т.д.

      И к слову а почему 22 декабря 2222 это некорректная дата?

      Да, Вы оптимист :) Нет данных по этому году, пока что, поэтому ошибка (хотя я вот смотрю так, думаю, да, вероятно, имеет смысл добавить динамическое определение выходного). Спасибо.


    1. vasechka
      24.07.2017 22:46

      собственно сервису проверки даты он нужен, как козе рукав.

      ну почему же? зачем всем видеть, что айпи 33.33.33.33 решил узнать выходной ли пятое апреля 18 года?


  1. solnechnyi
    24.07.2017 21:45

    Отличное начинание!
    Только на 2 года вперёд?
    https://isdayoff.ru/20190729 = 100


    1. la_stik
      24.07.2017 22:04

      Увы, да.
      Актуальная база находится здесь: https://isdayoff.ru/db

      (МинТруд пока не в курсе, как назначит праздники в 2019 году)


      1. vasechka
        24.07.2017 22:46

        а почему код ошибки 100? почему бы не сделать простое и всем понятное: 404, если года в календаре нет?


        1. la_stik
          25.07.2017 13:13

          Так же хорошее замечание, но код возврата сервиса <> коду возврата HTTP (но ваше замечание весьма в тему и приму его во внимание. Спасибо)


  1. GerrAlt
    25.07.2017 10:22

    а может iso формат даты лучше? во-первых документированный, во-вторых читается глазами легче, а экономия на двух дефисах минимальна


    1. la_stik
      25.07.2017 13:17

      Пожалуй да, удобно при запросе через date -I
      (кстати YYYYMMDD — так же ISO 8601:2004, или мы про разные ISO говорим?)


      1. GerrAlt
        25.07.2017 16:00

        вы правы, с точки зрения ISO8601 YYYYMMDD правильный формат, я почему-то был уверен что обязательны разделители, привычка к YYYY-MM-DD видимо сказалась


  1. TheGodfather
    27.07.2017 21:57

    А где ссылка на гитхаб?


    1. la_stik
      27.07.2017 21:58
      +1

      Ссылка на гитхаб: https://github.com


  1. ABrandt
    31.07.2017 00:39

    Надеюсь, вы учли, что сб и вс не всегда выходные.


    1. la_stik
      31.07.2017 09:29

      Да, конечно
      Возьмём например 28 апреля 2018 года (был перенос выходного с 28 на 30 апреля по указу в РФ):

      curl https://isdayoff.ru/20180428
      0