Created
June 21, 2018 13:37
-
-
Save mamontov-cpp/3083c4118b07912aeae8db58db034405 to your computer and use it in GitHub Desktop.
DateTime.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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