115 lines
2.9 KiB
PHP
115 lines
2.9 KiB
PHP
<?php
|
||
|
||
/**
|
||
* Хелпер для работы с датой и временем
|
||
*/
|
||
abstract class Date
|
||
{
|
||
const MYSQL_FORMAT = 'Y-m-d H:i:s';
|
||
const MYSQL_FORMAT_DATE = 'Y-m-d';
|
||
const DEADLINE_DONE = 'Сдан';
|
||
|
||
private static $endingPeriodFomat = '%d квартал %d';
|
||
|
||
public static function getQuarterByMonth($month)
|
||
{
|
||
assert('$month>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;
|
||
}
|
||
} |