- Работа с производственным календарем на PHP
- PHP календарь: скрипт календаря для сайта на PHP + HTML + CSS
- PHP скрипт календаря в русском стиле
- Результат
- PHP скрипт календаря в английском стиле
- Результат
- Календарь событий PHP + Javascript
- Логика
- Генерируем календарь на PHP
- Javascript код для перематывание месяцев
- Выводы
- Сервис по определению принадлежности даты к выходному дню (API производственного календаря)
- Почему не выбрать аналоги?
- Послесловие
- Читают сейчас
- Редакторский дайджест
- Похожие публикации
- Внедрение со стороны Google API FLoC вместо Cookie может только повысить уровень слежки за пользователям
- Свободное API для поиска в интернете
- Идеальная версия недельной сетки календаря для печати
- Вакансии
- Минуточку внимания
- Комментарии 27
- Создание PHP календаря
Работа с производственным календарем на PHP
Бывают ситуации, когда необходимо рассчитать дату с учетом именно рабочих, а не календарных дней. На какую-либо алгоритмизацию здесь полагаться достоверно не приходится, поскольку правительство РФ то и дело штампует исключения из правил. То новогодние выходные перенесут на май, то субботу сделают рабочей, а выходной перенесут на будний день. И так каждый год! И все эти ситуации необходимо учитывать.
В интернете на этот счет есть несколько решений, но все они либо некорректные, либо совершенно неудобные. Несколько таких решений: Один, Два и Три.
В связи с таким положением дел и был написан класс WorkCalendar, позволяющий удобно работать с производственным календарем. WorkCalendar расширяет возможности класса CarbonCarbon, поэтому работать с ним одно удовольствие. Итак, добавленные методы:
- isWorkday(): bool — true , если день рабочий, иначе false . Один из наиболее удобных методов. Позволяет выяснить, является ли текущий день рабочим. Пример:
- diffInWorkdays(WorkCalendar $carbon): int — возвращает разницу в рабочих днях между двумя датами. Может возвращать отрицательное значение, если передаваемая дата меньше(раньше) текущей. Пример:
- addWorkday() — добавить рабочий день к текущей дате. Пример:
- subWorkday() — отнять рабочий день от текущей даты. Пример:
- addWorkdays(int $count) — добавить $count рабочих дней к текущей дате. Крайне полезен в ситуациях «через 10 рабочих дней», «в течение 5 рабочих дней», коими грешат наши государственные конторы. Пример:
- subWorkdays(int $count) — отнять $count рабочих дней от текущей даты. Пример:
Устанавливается данный хелпер через composer:
Текущие ограничения
Для корректной работы класса, ему нужно откуда-то брать информацию о всех праздничных днях. Этим источником является xmlcalendar.ru. Так вот, там есть данные только начиная с 2013 года. Также данный хелпер учитывает только официальные праздники РФ, но не какие-либо региональные праздники.
Собственный производственный календарь
Производственный календарь использует массив из 365 элементов, который может принимать 0 в случае, если день является праздничным, и 1 иначе. Соответственно, чтобы использовать собственный производственный календарь основанный на национальных праздниках, например, Республики Казахстан, для этого нужно сделать несколько вещей:
- Определить класс, который будет отвечать за формирование маски рабочих дней. Для этого необходимо отнаследоваться от класса TochkaCalendarAbstractYearMaskProvider и определить метод generateYearMask(int $year) , который и занимается формированием массива с маской рабочих дней.
- В новом классе переопределить константу RES_DIR, указывающую, в какую директорию необходимо сохранять маски рабочих дней, чтобы постоянно их не генерировать.
- При использовании рабочего календаря с помощью метода TochkaCalendarWorkCalendar::setMaskProvider(AbstractYearMaskProvider $provider) указать вновь созданный класс.
Источник статьи: http://codengineering.ru/post/49
PHP календарь: скрипт календаря для сайта на PHP + HTML + CSS
Одним из важных элементов на сайте является календарь, с помощью которого ваши пользователи могут отслеживать события, появления новых продуктов. Или просто читать записи или еще что только не придумаешь. Уделив несколько времени этому уроку, вы узнаете, как создать PHP скрипт календаря для своего сайта. Мы не будем ограничиваться только программированием, также обратим внимание на css и html структуру календаря. Одним словом сделаем все, от начала до конца!
Меньше слов, больше дела. Сразу же начнем из css стилей календаря. Ниже предоставленный код, совместим с проблемным браузером IE6.
Весь PHP код скрипта календаря, в основном базируется на одной функции, которая требует два параметра: желаемый месяц и год. Следует отметить, в средине функции, я оставил место для mysql запроса к базе данных. Если хотите, можете выводить необходимые события в сетку календаря. При написании этого скрипта, я использовал таблицы, вместо div блоков, так как они более практичны в случае, если один день будет пресыщен событиями.
За основу брался англоязычный скрипт календаря, поэтому предоставлю две версии: календарь в английском и русском стиле. Выбирайте, какой вам по душе! Разница только в PHP коде. CSS стили остаются прежними, для обеих вариантов.
PHP скрипт календаря в русском стиле
Результат
PHP скрипт календаря в английском стиле
Впринципе, незнаю зачем он вам. Но, вдруг кому-то нужен именно такой. Код практически тот же.
Результат
Вот и все! Надеюсь, этот скрипт календаря на PHP, был полезен для вас. Не ограничивайтесь этим кодом, вносите коррективы и расширяйте скрипт. Кто планирует воспользоваться скриптом или уже воспользовался, просьба отписаться в комментариях и оставить ссылку на страницу с примером.
Источник статьи: http://sitear.ru/material/php-kalendar-skript-kalendarya-dlya-sayta-na-php
Календарь событий PHP + Javascript
Недавно возникла потребность создать календарь событий, где каждая дата в календаре будет подсвечена ссылкой, если какое-нибудь событие присутствует для каждого числа. Если мне разрешат оставить ссылку, здесь демонстрация работы календаря.
Задача вроде бы не сложная, но среди немногочисленных решений в интернете я не нашел подходящего по следующим причинам: слишком сложный и непонятный код, медленные запросы к БД (это особенно ощущается, если в базе много записей), использование библиотеки jQuery, к которой я отношусь не очень хорошо.
Итак, к плюсам моего календаря можно отнесли следующее:
- Весь код помещается в 200 строчек и состоит из одного файла, который подключается через include
- Скрипт состоит из чистого php + javascript без использования библиотеки jQuery
- Используются простые и оптимизированные запросы к БД
- Подгрузка следующего (предыдущего) месяца происходит через AJAX
Теперь обо всем по-порядку.
Логика
Календарь генерируется средствами php для текущего месяца. Для каждого дня проверяем нет ли записей в БД, если есть, — формируем ссылку на событие. Дописываем javascript код для перелистывание месяцев, который обращается к скрипту через ajax. Задача усложняется тем, что события растянуты во времени, то есть, начинаются в один день, а заканчиваются через несколько дней или даже месяцев. На всем временном промежутке существование события нужно его подсветить ссылкой для каждого дня.
Генерируем календарь на PHP
Таким образом, мы выбрали все записи, которые есть в текущем месяце.
Дальше самое интересное: заполняем обходочный массив. Для того, чтобы не крутить лишний раз все заново, если находится соответствие, элемент массива удаляется и следующий цикл имеет меньше итераций.
Собственно, сам календарь:
Javascript код для перематывание месяцев
Он немного упрощен для наглядности (отсутствуют эффекты скольжения):
Закрываем тег таблицы:
Выводы
Таким образом получился простой и легко встраиваемый календарь событий, который быстро работает и легко настраивается, работающий на чистом PHP+javascript без дополнительных библиотек.
Источник статьи: http://habr.com/ru/post/236813/
Сервис по определению принадлежности даты к выходному дню (API производственного календаря)
Добрый день, коллеги! Совсем недавно решил выложить в общий доступ свой маленький проект, связанный с определением выходного дня (очень не хватает слова «выхòдность», т.е. принадлежность к выходному дню). Мне это понадобилось, когда я составлял план срочных бэкапов и их переливки из одного офиса в другой, дабы не тревожить пользователей в рабочие дни.
Основная суть проекта проста — в 1-2 строки кода узнать выходной день или нет.
Пока возможно проверять только 1 день, только для России и начиная с 2010 года (кстати, полный список загруженных годов и стран, можно узнать тут).
Для проверки, например, 24 июля 2017 года, необходимо и достаточно:
Ответ 0, а это значит будний день. Подобным образом можно проверить любой день в этом и предыдущих годах. Если будет задана некорректная дата, то ответ будет 100.
Почему не выбрать аналоги?
В процессе решения проблемы, я рассматривал аналоги, наиболее яркие из всех, это http://basicdata.ru/api/calend/ и http://xmlcalendar.ru/
1. Слишком (слишком-слишком) много информации (приходится парсить, на bash это делать сложно — проще просто получить готовый ответ от сервиса)
2. А где https?
Послесловие
Ой, у вас баннер убежал!
Читают сейчас
Редакторский дайджест
Присылаем лучшие статьи раз в месяц
Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.
Похожие публикации
Внедрение со стороны Google API FLoC вместо Cookie может только повысить уровень слежки за пользователям
Свободное API для поиска в интернете
Идеальная версия недельной сетки календаря для печати
Вакансии
AdBlock похитил этот баннер, но баннеры не зубы — отрастут
Минуточку внимания
Комментарии 27
Выходной день это вместе с праздниками? Если нет, то чем не устраивает обычный расчет Юлианская дата? А если да, то насколько можно доверять по заполнению праздничных дней по СНГ?
Upd: нарыл еще такой сервис http://api1.vasha-ats.ru/daytype.php?date=2017-07-22
Как понимаю, совпадает с вашим по функционалу
(кстати, полный список загруженных годов и стран, можно узнать тут).
Но, если честно, web-сервис для определения выходного это какой-то перебор. Я пользуюсь numpy.is_busday и это одна строчка + определение календаря, если мне нужно добавить какие-то специфические календари, типа когда была открыта биржа или что-то еще. Вот это и есть одна-две строчки.
За 404 дико извиняюсь. Восстановил
Но, если честно, web-сервис для определения выходного это какой-то перебор.
тогда где возможность выбора календаря? (знаю, что сейчас один, но, скажем, добавите вы туда выходные в украине или сша — как выбрать?)
В данный момент вижу 2 пути:
- Просто параметр cc (с кодом страны из ISO) после даты — наверно, самое простое
- Использование поддомена вместо параметра (короче на целых 3 символа) — и в плане балансировки этот способ интереснее
Добавить форматы для вывода JSON/XML/YAML
Вот это правильно, но все же если апи то излишне, каждый сам может обработать ответ в нужном виде, если только забирать с сервиса список выходных за год, но зачем?
Можно поподробнее что туда будет входить?
И к слову а почему 22 декабря 2222 это некорректная дата?
Вы не учитываете переноса выходных в связи с праздниками. Алгоритмом этот перенос посчитать невозможно, потому что он определяется волей левой пятки Минтруда.
Год некорректный скорее всего потому, что для него пока ещё не опубликован трудовой календарь.
Э-э-э-э. Извините конечно, но определять выходной день или нет можно просто, делением и проверкой возврата?
И делается это скриптом написанном на коленке, единственная проблема прикрутить все праздники для разных стран, хотя это вопрос времени, парсить их потихоньку и добавлять.
Как ответили чуть ниже, праздники (в частности в РФ, примерно летом МинТруд обозначает приказом), угадать — невозможно, а в целом это и есть некая цель — прикрутить праздники и выходные разных государств, как и написал в TODO
Вот это правильно, но все же если апи то излишне, каждый сам может обработать ответ в нужном виде, если только забирать с сервиса список выходных за год, но зачем?
Как говорится, на вкус и цвет, все фломастеры разные, мне удобно работать с plain данными, т.к. работаю из bash, я более чем уверен, что есть люди, которым проще скормить кусок JSON, и работать как с объектом. Это уже как по накатанной.
Можно поподробнее что туда будет входить?
Во-первых, самое простое — это возврат предпраздничного дня (код ответа 2), во-вторых, чуть расширеннее возврат данных, полная дата и т.д.
И к слову а почему 22 декабря 2222 это некорректная дата?
собственно сервису проверки даты он нужен, как козе рукав.
ну почему же? зачем всем видеть, что айпи 33.33.33.33 решил узнать выходной ли пятое апреля 18 года?
Источник статьи: http://habr.com/ru/post/405519/
Создание PHP календаря
В этой статье я расскажу как создать функциональный календарь с использованием PHP. Около года назад мне поручили сделать календарь событий на одном сайте. Заказчик не очень жаловал javascript или ajax, поэтому настоял на использовании PHP. Это было довольно интересный опыт. Мне пришлось забыть свои мечты о быстром выполнении заказа с использованием jQuery datepicker. Я уже приготовился к тому, что мне предстоит тяжелая работа. Потом меня осенило. Ведь календарь, по сути, является ни чем иным как системой циклических чисел. Чем больше я об этом думал, тем легче мне начинала казаться задача. В конце концов, после небольшого исследования о функциях даты PHP, я придумал способ, который действительно сработал. Рабочий пример можно скачать здесь.
Начнем с установки нескольких переменных среды. Очевидно, что нам необходимо знать URL нашего скрипта, и, поскольку мы работаем с календарем, нам нужна дата, от которой мы будем отталкиваться. Нам нужно проверить, указывает ли назначенная на наш URL переменная на конкретный год, месяц и день. Если нет, то мы начнем с сегодняшней даты.
Следующая задача будем немного сложнее, чем кажется, когда мы впишем ее в код. Мне нужно было изменить год, когда наступал следующий за декабрем месяц. Позже вы увидите, что то же самое нужно будет делать и на тот случай, если календарь будет просматриваться в обратную сторону.
Теперь давайте используем установленные выше значения месяца и года, чтобы выяснить, на какой день выпадет начало нового месяца. К счастью, mktime идеально подойдет для этой задачи. Если кто не знает, в mktime передаются следующие значения: Час, Минута, Секунда, Месяц, День и Год. Затем он выдает временную метку Unix для этого момента времени.
Как видите, мы потратили достаточно много времени на то, чтобы убедиться, что мы знаем наше положение во времени и можем влиять на то, что произойдет, когда значения дней, лет и месяцев будут уменьшаться или увеличиваться при просмотре календаря. Важно помнить, что при работе с датами всегда полезно устанавливать значения по умолчанию, прежде чем приступать к созданию кода. Нельзя точно знать, что вам понадобиться, но по ходу выполнения задачи вам почти наверняка нужно будет узнать текущий день, месяц и год. Мы снова используем функцию даты() в PHP и mktime(), чтобы точно манипулировать числами. Далее мы начинаем чертить календарь.
Выше мы сделали заголовок таблицы и ссылки навигации, чтобы переходить вперед и назад по месяцам и годам в календаре. Теперь мы печатаем дни, выделяя сегодняшнюю дату. Каждый день – это ссылка на тот день, на который мы можем перейти. Теперь будет просто создать систему событий, так как день, месяц и год, на которые вы кликаете, указывает на URL, благодаря чему вы можете просматривать установки и показывать события согласно этому.
Хотите — верьте, хотите – нет, но на этом все. Теперь можно кликать на каждый день календаря, переходить на месяцы и годы, нажимая на стрелки рядом с названием месяца в заголовке таблицы. Сегодняшняя дата отличается от всех остальных своим классом CSS, поэтому ее можно стилизовать по своему усмотрению, и у нас получился довольно гибкий календарь. В завершение хочу включить в наш проект небольшую форму, которая позволит вам переходить на любой месяц любого года на двадцать лет вперед. Также хочу предложить ссылку для перехода на текущий месяц. Код очень простой:
Источник статьи: http://janicky.com/stati/sozdanie-php-kalendarya