Example #1
0
 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;
 }
Example #2
0
 /**
  * getDateByForm
  * Получает дату из заполненной формы даты
  *
  * @param null|array $arParams
  *
  * @return array
  */
 public static function getDateByForm($arParams = null)
 {
     /*
     		$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::IncludePackage("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;
 }