Joywork/import/helper/Date.php

115 lines
2.9 KiB
PHP
Raw Normal View History

2026-05-22 20:21:54 +02:00
<?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;
}
}