0'); assert('$month<13'); return ceil(($month)/3); } /** * 2030-06-20 => 2 квартал 2030 * @param string $ep ending period * @param Clock|null $clock * @return string */ public static function getFormatedEndingPeriod($ep, Clock $clock = null) { if ($clock === null) { $clock = new RealtimeClock(); } $curQuarter = self::getQuarterByMonth($clock->now()->format('m')); $curYear = (int)$clock->now()->format('Y'); $parts = explode('-', $ep); if (count($parts) != 3) { return ''; } $quarter = self::getQuarterByMonth((int)$parts[1]); $year = (int)$parts[0]; if ( $year < $curYear || $year == $curYear && $quarter < $curQuarter ) { return self::DEADLINE_DONE; } return sprintf(self::$endingPeriodFomat, $quarter, $year); } public static function parseDateTime($str) { return (int)strtotime($str); } public static function dateToMysql($time) { return date(self::MYSQL_FORMAT_DATE, $time); } public static function dateTimeToMysql($time) { return date(self::MYSQL_FORMAT, $time); } public static function getLastPeriodDate($ts) { $parts = explode('-', date('Y-m-d', $ts)); $i = floor($parts[1]/4)+1; $lastDay = ($i == 1 && $i ==2) ? 30 : 31; $month = 3*$i; return $parts[0] . "-" . $month . "-". $lastDay; } public static function getDateForApi($date) { $ts = self::parseDateTime($date); return date('d.m.Y', $ts); } public static function getListDeadlines($count = 10) { $lastDay = [ 3 => 31, // март 6 => 30, // июнь 9 => 30, // сентябрь 12 => 31, // декабрь ]; // предыдущий квартал: сдан $quarter = self::getQuarterByMonth((int)date('m')) -1; $year = (int)date('Y'); if (!$quarter) { $quarter = 4; --$year; } $list = []; while ($count--) { $month = $quarter*3; $ts = mktime(0, 0, 0, $month, $lastDay[$month], $year); $formated = self::dateToMysql($ts); $list[$ts] = self::getFormatedEndingPeriod($formated); if (++$quarter > 4) { $quarter = 1; ++$year; } } return $list; } }