Skip to content

Instantly share code, notes, and snippets.

@mamontov-cpp
Created June 21, 2018 13:37
Show Gist options
  • Save mamontov-cpp/3083c4118b07912aeae8db58db034405 to your computer and use it in GitHub Desktop.
Save mamontov-cpp/3083c4118b07912aeae8db58db034405 to your computer and use it in GitHub Desktop.
DateTime.php
<?php
/**
* Автор: Бурым
* Описание: вспомогательный класс для работы с датой и временем
*/
class CC_DateTime
{
/**
* Номер первого месяца в году
*/
const FIRST_MONTH_NUM = 1;
/**
* Номер последнего месяца в году
*/
const LAST_MONTH_NUM = 12;
/**
* Формат даты, при котором она показывается как короткая, без часов, минут, секунд
*/
const DATE_FORMAT_SHORT = 'SHORT';
/**
* Формат даты, при котором она показывается, как полная
*/
const DATE_FORMAT_FULL = 'FULL';
/**
* Количество секунд в дне
*/
const SECONDS_IN_DAY = 86400;
/**
* Количество секунд в часе
*/
const SECONDS_IN_HOUR = 3600;
/**
* Количество секунд в минуте
*/
const SECONDS_IN_MINUTE = 60;
/**
* Форма даты по умолчанию для функции date
*/
const DEFAULT_DATE_FORMAT = 'd.m.Y H:i:s';
/**
* Количество миллисекунд в секунде
*/
const MILLISECONDS_IN_SECOND = 1000;
/**
* Доступные языки
*/
const LANG_RU = 'ru';
const LANG_EN = 'en';
static $langs = array(
self::LANG_RU,
self::LANG_EN,
);
/**
* Соответствие между номерами и названиями месяцов
* @var array
*/
private static $monthsNames = array(
self::LANG_EN => array(
1 => "january",
2 => "february",
3 => "march",
4 => "april",
5 => "may",
6 => "june",
7 => "july",
8 => "august",
9 => "september",
10 => "october",
11 => "november",
12 => "december",
),
self::LANG_RU => array(
1 => "январь",
2 => "февраль",
3 => "март",
4 => "апрель",
5 => "май",
6 => "июнь",
7 => "июль",
8 => "август",
9 => "сентябрь",
10 => "октябрь",
11 => "ноябрь",
12 => "декабрь",
),
);
/**
* Времена года
* @var array
*/
static $seasons = array(
self::LANG_EN => array(
0 => 'winter',
1 => 'spring',
2 => 'summer',
3 => 'autumn'
),
self::LANG_RU => array(
0 => 'зима',
1 => 'весна',
2 => 'лето',
3 => 'осень'
),
);
/**
* Добавляет число месяцев к Unix timestamp.
* @param int $timeStamp timestamp
* @param int $amountOfMonths число добавляемых месяцев
* @return int результирующий timestamp
*/
public static function addMonths($timeStamp, $amountOfMonths)
{
$c = new \DateTime();
$c->setTimestamp($timeStamp);
$i = new \DateInterval("P" . $amountOfMonths . 'M');
$c->add($i);
return $c->getTimestamp();
}
/**
* Возвращает название месяца в родительном падеже с маленькой буквы
* @param int $monthIndex индекс месяца
* @return array значение массива
* @throws Exception при неверном индексе месяца
*/
public static function getMonthNameInGenitiveCase($monthIndex)
{
if (($monthIndex < 1) || ($monthIndex > 12)) {
throw new \Exception('Неверный индекс месяца' . $monthIndex);
}
return tpkGetMonth($monthIndex, 'r', 0);
}
/**
* Метод возвращает название текущего времени года
* @param string $lang язык, на котором необходимо получить название времени года
* @return string
*/
public static function getCurrentSeason($lang = self::LANG_EN)
{
$lang = self::checkLang($lang);
return self::$seasons[$lang][floor(date('n') / 3) % 4];
}
/**
* Метод возвращает название текущего месяца
* @param string $lang язык, на котором необходимо получить название месяца
* @return string
*/
public static function getCurrentMonthName($lang = self::LANG_RU)
{
$lang = self::checkLang($lang);
return self::$monthsNames[$lang][intval(date('n'))];
}
/**
* Метод возвращает название месяца, чей номер передан в параметрах
* @param string $lang язык, на котором необходимо получить название месяца
* @return string|null
*/
public static function getMonthName($monthNum, $lang = self::LANG_RU)
{
$lang = self::checkLang($lang);
return self::$monthsNames[$lang][intval($monthNum)];
}
/**
* Возвращает текущую дату и время в формате по умолчанию
* @return string
*/
public static function getCurrentDateTime()
{
return date(self::DEFAULT_DATE_FORMAT);
}
/**
* Метод возвращает номер месяца по его названию, либо false, если не удалось найти
* @param string $monthName название месяца
* @param string $lang язык переданного названия месяца
* @return int | false
*/
public static function getMonthNumByName($monthName, $lang = self::LANG_RU)
{
// Проверяем и подготавливаем параметры
$lang = self::checkLang($lang);
$monthName = strtolower($monthName);
// Получаем массив "название месяца" => "номер месяца"
$monthsNumsToNames = self::$monthsNames[$lang];
$monthsNamesToNums = array_flip($monthsNumsToNames);
// Получаем номер месяца
$monthNum = false;
if (array_key_exists($monthName, $monthsNamesToNums)) {
$monthNum = $monthsNamesToNums[$monthName];
}
return $monthNum;
}
/**
* Метод конверитрует дату в формат ISO 8601
* @param string $dateTime дата в формате:
* http://php.net/manual/ru/datetime.formats.date.php
* http://php.net/manual/ru/datetime.formats.time.php
* @return string
*/
public static function convertToUTCFormat($dateTime)
{
$convertedDateTime = '';
$timestamp = strtotime($dateTime);
if ($timestamp) {
$convertedDateTime = date("Y-m-d", $timestamp) . "T" . date("H:i:sP", $timestamp);
}
return $convertedDateTime;
}
/**
* Проверка переданного языка
* @param string $lang язык
* @return string
*/
protected static function checkLang($lang)
{
if (in_array($lang, self::$langs)) {
return $lang;
} else {
return self::LANG_EN;
}
}
/**
* Переводит дату из формата БД в формат сайта
* @param string $date дата
* @param string $type тип даты (SHORT - короткий, d.m.Y, FULL - полный, с минутами)
* @return string строка
*/
public static function dateInDBFormatToSiteFormat($date, $type) {
global $DB;
$langs = new CLang();
return date($DB->DateFormatToPHP($langs->GetDateFormat($type, SITE_ID)), MakeTimeStamp($date, 'YYYY-MM-DD HH:MI:SS'));
}
/**
* Переводит дату из формата заказа в формат сайта
* @param string $date дата
* @param string $type тип даты (SHORT - короткий, d.m.Y, FULL - полный, с минутами)
* @return string строка
*/
public static function dateInOrderFormatToSiteFormat($date, $type) {
global $DB;
$langs = new CLang();
$siteId = SITE_ID;
// Сделано, чтобы учесть и админку, и обычные страницы, так как формат дат совпадает
// на всех сайтах.
if (($siteId == 'ru') || ($siteId == 'en')) {
$siteId = UCHMAG_LID;
}
return date($DB->DateFormatToPHP($langs->GetDateFormat($type, $siteId)), MakeTimeStamp($date, 'DD.MM.YYYY HH:MI:SS'));
}
/**
* Метод конвертирует секунды в часы, и округляет до двух цифр после запятой
* @param int $seconds количество секунд
* @return float
*/
public static function convertSecondsToHours($seconds)
{
return round(($seconds / self::SECONDS_IN_HOUR), 2);
}
/**
* Метод конвертирует количество секунд в строку с часами и минутами
* @param int $seconds количество секунд
* @param string $case падеж, в котором выводить строку
* (будет корректно работать для именительного и винительного падежей. Этого должно быть достаточно)
* @return float
*/
public static function convertSecondsToHoursWithMinutesString($seconds, $case = CC_MorpherHelper::NOMINATIVE_CASE)
{
$hoursWithMinutesString = '';
$countHoursAfterOrdered = intval(floor(self::convertSecondsToHours($seconds)));
$countMinutesAfterOrdered = intval(floor(($seconds - $countHoursAfterOrdered * CC_DateTime::SECONDS_IN_HOUR) / CC_DateTime::SECONDS_IN_MINUTE));
$countMinutesAfterOrdered = $countMinutesAfterOrdered ? $countMinutesAfterOrdered : 1;
if ($countHoursAfterOrdered ) {
$hoursWithMinutesString = $countHoursAfterOrdered . ' ' . CC_Utils::getWordForm($countHoursAfterOrdered, 'час', 'часа', 'часов');
}
$case = in_array($case, CC_MorpherHelper::$availableCases) ? $case : CC_MorpherHelper::NOMINATIVE_CASE;
if ($countMinutesAfterOrdered) {
$hoursWithMinutesString .= ' ' . $countMinutesAfterOrdered . ' ' . morpher_inflect(CC_Utils::getWordForm($countMinutesAfterOrdered, 'минута', 'минуты', 'минут'), $case);
}
return trim($hoursWithMinutesString);
}
/**
* Метод возращает колличество дней в текущем году
* @return int
*/
public static function getDaysInCurrentYear()
{
return date('L') ? 366 : 365;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment