protected static function getCalendar($month, $year) { //В коде может использоваться другой пакет if (CoreLib\Loader::issetPackage('dates')) { //Если пакет установлен, подключаем его CoreLib\Loader::IncludePackage('dates'); } //$month = 2; $year = 2017; //Для теста $arCalendar = array(); $dateHelper = new CoreLib\DateHelper(); $arCalendar["INFO"]["MONTH"] = $month; $arCalendar["INFO"]["YEAR"] = $year; //Получаем timestamp на первое число заданного месяца и года $arCalendar["INFO"]["START_DATE"] = "1." . $month . "." . $year; $arCalendar["INFO"]["START_TIMESTAMP"] = $dateHelper->getDateTimestamp($arCalendar["INFO"]["START_DATE"]); //Получаем количество дней в месяце $arCalendar["INFO"]["NUMBER_OF_DAYS"] = intval(date("t", $arCalendar["INFO"]["START_TIMESTAMP"])); //Получаем timestamp на последнее число заданного месяца и года $arCalendar["INFO"]["LAST_DATE"] = $arCalendar["INFO"]["NUMBER_OF_DAYS"] . "." . $month . "." . $year; $arCalendar["INFO"]["LAST_TIMESTAMP"] = $dateHelper->getDateTimestamp($arCalendar["INFO"]["LAST_DATE"]); //Получаем день недели для 1го числа месяца $arCalendar["INFO"]["START_DAY_OF_WEEK"] = intval(date("w", $arCalendar["INFO"]["START_TIMESTAMP"])); if ($arCalendar["INFO"]["START_DAY_OF_WEEK"] == 0) { $arCalendar["INFO"]["START_DAY_OF_WEEK"] = 7; } //Получаем день недели для последнего числа месяца $arCalendar["INFO"]["LAST_DAY_OF_WEEK"] = intval(date("w", $arCalendar["INFO"]["LAST_TIMESTAMP"])); if ($arCalendar["INFO"]["LAST_DAY_OF_WEEK"] == 0) { $arCalendar["INFO"]["LAST_DAY_OF_WEEK"] = 7; } //Если 1е число не понедельник - нужно получить несколько дней предыдущего месяца if ($arCalendar["INFO"]["START_DAY_OF_WEEK"] != 1) { $arCalendar["INFO"]["DAY_PREV_MONTH"] = $arCalendar["INFO"]["START_DAY_OF_WEEK"] - 1; $arCalendar["INFO"]["FIRST_DAY_PREV_MONTH"] = $dateHelper->strToTime($arCalendar["INFO"]["START_DATE"], "-" . $arCalendar["INFO"]["DAY_PREV_MONTH"] . " day"); list($arCalendar["INFO"]["PREV_MONTH_DAY"], $arCalendar["INFO"]["PREV_MONTH_MONTH"], $arCalendar["INFO"]["PREV_MONTH_YEAR"]) = explode(".", $arCalendar["INFO"]["FIRST_DAY_PREV_MONTH"]); for ($i = 0; $i < $arCalendar["INFO"]["DAY_PREV_MONTH"]; $i++) { if ($i == 0) { $dayOfWeek = date("w", $dateHelper->getDateTimestamp(intval($arCalendar["INFO"]["PREV_MONTH_DAY"]) . "." . intval($arCalendar["INFO"]["PREV_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["PREV_MONTH_YEAR"]))); if ($dayOfWeek == 0) { $dayOfWeek = 7; } //Использование пакета "Даты" if (CoreLib\Loader::issetPackage('dates')) { $isDayOff = \MSergeev\Packages\Dates\Lib\WorkCalendar::isDayOff(intval($arCalendar["INFO"]["PREV_MONTH_DAY"]) . "." . intval($arCalendar["INFO"]["PREV_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["PREV_MONTH_YEAR"])); if ($isDayOff) { $dayOfWeek = 6; } else { $dayOfWeek = 1; } } $arCalendar["PREV_MONTH"][intval($arCalendar["INFO"]["PREV_MONTH_DAY"]) . "." . intval($arCalendar["INFO"]["PREV_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["PREV_MONTH_YEAR"])] = array("TEXT" => intval($arCalendar["INFO"]["PREV_MONTH_DAY"]) . " " . self::getMonthName(intval($arCalendar["INFO"]["PREV_MONTH_MONTH"])), "DAY_OF_WEEK" => $dayOfWeek); } else { $dayOfWeek = date("w", $dateHelper->getDateTimestamp(intval($arCalendar["INFO"]["PREV_MONTH_DAY"]) + $i . "." . intval($arCalendar["INFO"]["PREV_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["PREV_MONTH_YEAR"]))); if ($dayOfWeek == 0) { $dayOfWeek = 7; } //Использование пакета "Даты" if (CoreLib\Loader::issetPackage('dates')) { $isDayOff = \MSergeev\Packages\Dates\Lib\WorkCalendar::isDayOff(intval($arCalendar["INFO"]["PREV_MONTH_DAY"]) + $i . "." . intval($arCalendar["INFO"]["PREV_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["PREV_MONTH_YEAR"])); if ($isDayOff) { $dayOfWeek = 6; } else { $dayOfWeek = 1; } } $arCalendar["PREV_MONTH"][intval($arCalendar["INFO"]["PREV_MONTH_DAY"]) + $i . "." . intval($arCalendar["INFO"]["PREV_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["PREV_MONTH_YEAR"])] = array("TEXT" => intval($arCalendar["INFO"]["PREV_MONTH_DAY"]) + $i, "DAY_OF_WEEK" => $dayOfWeek); } } } //Вносим информацию по заданному месяцу for ($i = 0; $i < $arCalendar["INFO"]["NUMBER_OF_DAYS"]; $i++) { if ($i == 0) { $dayOfWeek = date("w", $dateHelper->getDateTimestamp($i + 1 . "." . $month . "." . $year)); if ($dayOfWeek == 0) { $dayOfWeek = 7; } //Использование пакета "Даты" if (CoreLib\Loader::issetPackage('dates')) { $isDayOff = \MSergeev\Packages\Dates\Lib\WorkCalendar::isDayOff($i + 1 . "." . $month . "." . $year); if ($isDayOff) { $dayOfWeek = 6; } else { $dayOfWeek = 1; } } $arCalendar["NOW_MONTH"][$i + 1 . "." . $month . "." . $year] = array("TEXT" => $i + 1 . " " . self::getMonthName($month), "DAY_OF_WEEK" => $dayOfWeek); } else { $dayOfWeek = date("w", $dateHelper->getDateTimestamp($i + 1 . "." . $month . "." . $year)); if ($dayOfWeek == 0) { $dayOfWeek = 7; } //Использование пакета "Даты" if (CoreLib\Loader::issetPackage('dates')) { $isDayOff = \MSergeev\Packages\Dates\Lib\WorkCalendar::isDayOff($i + 1 . "." . $month . "." . $year); if ($isDayOff) { $dayOfWeek = 6; } else { $dayOfWeek = 1; } } $arCalendar["NOW_MONTH"][$i + 1 . "." . $month . "." . $year] = array("TEXT" => $i + 1, "DAY_OF_WEEK" => $dayOfWeek); } } //Если последний день заданного месяца не воскресение - нужно добавить несколько дней следующего месяца if ($arCalendar["INFO"]["LAST_DAY_OF_WEEK"] != 7) { $arCalendar["INFO"]["FIRST_DAY_NEXT_MONTH"] = $dateHelper->strToTime($arCalendar["INFO"]["LAST_DATE"], "+1 day"); list($arCalendar["INFO"]["NEXT_MONTH_DAY"], $arCalendar["INFO"]["NEXT_MONTH_MONTH"], $arCalendar["INFO"]["NEXT_MONTH_YEAR"]) = explode(".", $arCalendar["INFO"]["FIRST_DAY_NEXT_MONTH"]); $arCalendar["INFO"]["DAY_NEXT_MONTH"] = 7 - $arCalendar["INFO"]["LAST_DAY_OF_WEEK"]; for ($i = 0; $i < $arCalendar["INFO"]["DAY_NEXT_MONTH"]; $i++) { if ($i == 0) { $dayOfWeek = date("w", $dateHelper->getDateTimestamp($i + 1 . "." . intval($arCalendar["INFO"]["NEXT_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["NEXT_MONTH_YEAR"]))); if ($dayOfWeek == 0) { $dayOfWeek = 7; } //Использование пакета "Даты" if (CoreLib\Loader::issetPackage('dates')) { $isDayOff = \MSergeev\Packages\Dates\Lib\WorkCalendar::isDayOff($i + 1 . "." . intval($arCalendar["INFO"]["NEXT_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["NEXT_MONTH_YEAR"])); if ($isDayOff) { $dayOfWeek = 6; } else { $dayOfWeek = 1; } } $arCalendar["NEXT_MONTH"][$i + 1 . "." . intval($arCalendar["INFO"]["NEXT_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["NEXT_MONTH_YEAR"])] = array("TEXT" => $i + 1 . " " . self::getMonthName(intval($arCalendar["INFO"]["NEXT_MONTH_MONTH"])), "DAY_OF_WEEK" => $dayOfWeek); } else { $dayOfWeek = date("w", $dateHelper->getDateTimestamp($i + 1 . "." . intval($arCalendar["INFO"]["NEXT_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["NEXT_MONTH_YEAR"]))); if ($dayOfWeek == 0) { $dayOfWeek = 7; } //Использование пакета "Даты" if (CoreLib\Loader::issetPackage('dates')) { $isDayOff = \MSergeev\Packages\Dates\Lib\WorkCalendar::isDayOff($i + 1 . "." . intval($arCalendar["INFO"]["NEXT_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["NEXT_MONTH_YEAR"])); if ($isDayOff) { $dayOfWeek = 6; } else { $dayOfWeek = 1; } } $arCalendar["NEXT_MONTH"][$i + 1 . "." . intval($arCalendar["INFO"]["NEXT_MONTH_MONTH"]) . "." . intval($arCalendar["INFO"]["NEXT_MONTH_YEAR"])] = array("TEXT" => $i + 1, "DAY_OF_WEEK" => $dayOfWeek); } } } return $arCalendar; }
/** * getDateByForm * Получает дату из заполненной формы даты * * @param null|array $arParams * * @return array */ public static function getDateByForm($arParams = null) { //Может использовать данных другого пакета if (Loader::issetPackage("dates")) { Loader::IncludePackage("dates"); } /* $arParams["eyear"] $arParams['emonth'] $arParams['eday'] $arParams['eaddday'] $arParams['emin'] $arParams['ehour'] $arParams['eplusminus'] $arParams["enoday"] $arParams["emonday"] $arParams["etuesday"] $arParams["ewednesday"] $arParams["ethursday"] $arParams["efriday"] $arParams["esaturday"] $arParams["esunday"] $arParams["eworkday"] $arParams["eweekend"] */ if (!is_array($arParams)) { return false; } $arReturn = array(); if ($arParams["eyear"] > 0) { $arReturn['year'] = $arParams['eyear']; $arReturn['Y'] = $arParams['eyear']; } else { $arReturn['year'] = date('Y'); $arReturn['Y'] = date('Y'); } if ($arParams['emonth'] > 0) { $arReturn['month'] = $arParams['emonth']; $arReturn['n'] = $arParams['emonth']; } else { $arReturn['month'] = date("n"); $arReturn['n'] = date("n"); } if ($arParams['eday'] > 0) { $arReturn['day'] = $arParams['eday']; $arReturn['j'] = $arParams['eday']; } else { if ($arParams['eaddday'] > 0) { $arReturn['day'] = 1; $arReturn['j'] = 1; } else { $arReturn['day'] = date('j'); $arReturn['j'] = date('j'); } } if ($arParams['emin'] > -1) { $arReturn['minute'] = $arParams['emin']; $arReturn['i'] = $arParams['emin']; if ($arParams['ehour'] > -1) { $arReturn['hour'] = $arParams['ehour']; $arReturn['G'] = $arParams['ehour']; } else { $arReturn['hour'] = 0; $arReturn['G'] = 0; } } else { if ($arParams['ehour'] > -1) { $arReturn['hour'] = $arParams['ehour']; $arReturn['G'] = $arParams['ehour']; $arReturn['minute'] = 0; $arReturn['i'] = 0; } else { $arReturn['hour'] = date('G'); $arReturn['G'] = date('G'); $arReturn['minute'] = date('i'); $arReturn['i'] = date('i'); } } $arReturn["log"] = $arReturn; if ($arParams['eaddday'] > 0) { if ($arParams['eplusminus'] > 0) { self::setDayDifference($arReturn, intval($arParams['eaddday'])); } else { self::setDayDifference($arReturn, intval($arParams['eaddday']), '-'); } } self::addDateInfo($arReturn); if (!$arParams["enoday"]) { if ($arParams["emonday"]) { $dayofweek = 1; } elseif ($arParams["etuesday"]) { $dayofweek = 2; } elseif ($arParams["ewednesday"]) { $dayofweek = 3; } elseif ($arParams["ethursday"]) { $dayofweek = 4; } elseif ($arParams["efriday"]) { $dayofweek = 5; } elseif ($arParams["esaturday"]) { $dayofweek = 6; } elseif ($arParams["esunday"]) { $dayofweek = 7; } else { $dayofweek = 0; } if ($dayofweek > 0) { $dayDifference = $dayofweek - $arReturn['dayofweek']; if ($dayDifference > 0) { self::setDayDifference($arReturn, $dayDifference); } elseif ($dayDifference < 0) { self::setDayDifference($arReturn, 7 + $dayDifference); } } else { if ($arParams["eworkday"]) { $dayofweek = 8; } elseif ($arParams["eweekend"]) { $dayofweek = 9; } else { $dayofweek = 0; } if (Loader::issetPackage("dates")) { $bLoadDates = true; } else { $bLoadDates = false; } if ($dayofweek == 8) { if (!$bLoadDates) { if ($arReturn['dayofweek'] >= 1 && $arReturn['dayofweek'] <= 5) { $dayDifference = 0; } elseif ($arReturn['dayofweek'] == 6) { $dayDifference = 2; } elseif ($arReturn['dayofweek'] == 7) { $dayDifference = 1; } if ($dayDifference > 0) { self::setDayDifference($arReturn, $dayDifference); } } else { $arDates = \MSergeev\Packages\Dates\Lib\WorkCalendar::getNearestDates($arReturn); $arReturn['dates'] = $arDates; for ($i = 0; $i < count($arDates); $i++) { $date = $arReturn['day'] . '.' . $arReturn['month'] . '.' . $arReturn['year']; if ($arDates[$date] == "X") { $mktime = mktime(0, 0, 0, $arReturn['month'], $arReturn['day'], $arReturn['year']); $dayofw = date('w', $mktime); if ($dayofw == 0) { $dayofw = 7; } if ($dayofw >= 1 && $dayofw <= 5) { $bWorkDay = true; } else { $bWorkDay = false; } if ($bWorkDay) { break; } } elseif ($arDates[$date] == "N") { break; } self::setDayDifference($arReturn, 1); } } } elseif ($dayofweek == 9) { if (!$bLoadDates) { if ($arReturn['dayofweek'] >= 1 && $arReturn['dayofweek'] <= 5) { $dayDifference = 6 - $arReturn['dayofweek']; } else { $dayDifference = 0; } if ($dayDifference > 0) { self::setDayDifference($arReturn, $dayDifference); } } else { $arDates = \MSergeev\Packages\Dates\Lib\WorkCalendar::getNearestDates($arReturn); for ($i = 0; $i < count($arDates); $i++) { $date = $arReturn['day'] . '.' . $arReturn['month'] . '.' . $arReturn['year']; if ($arDates[$date] == "X") { $mktime = mktime(0, 0, 0, $arReturn['month'], $arReturn['day'], $arReturn['year']); $dayofw = date('w', $mktime); if ($dayofw == 0) { $dayofw = 7; } if ($dayofw >= 1 && $dayofw <= 5) { $bWorkDay = true; } else { $bWorkDay = false; } if (!$bWorkDay) { break; } } elseif ($arDates[$date] == "Y") { break; } self::setDayDifference($arReturn, 1); } } } } } return $arReturn; }