Раз уж начали про вывод времени, позвольте продолжить.
Неймспейс для php, используемый для форматирования времени и строк.
PHP код:
<?php
class Format
{
private function __construct(){}
public function Plural($string, $value)
{
$arr = explode(':', $string);
$value = abs($value);
switch(count($arr))
{
case 1:
return $string;
case 2:
{
if($value > 1 && $value < 5)
return $arr***91;0***93;;
else
return $arr***91;1***93;;
}
case 3:
default:
{
if($value == 1)
return $arr***91;0***93;;
elseif($value > 1 && $value < 5)
return $arr***91;1***93;;
else
return $arr***91;2***93;;
}
}
}
public function Simple($b)
{
$args = func_get_args();
for ($i = 1, $count = count($args); $i < $count; $i++)
$b = str_replace('$'.$i, $args***91;$i***93;, $b);
return $b;
}
/***************** TIME *****************/
private static $TIME_SG = array('год','месяц','неделя','день','час','минута','секунда');
private static $TIME_PL = array(':года:лет',':месяца:месяцев',':недели:недель',':дня:дней',':часа:часов',':минуты:минут',':секунды:секунд');
private static $TIME_AB = array('г','мес','нед','дн','ч','мин','сек');
private function TimeInternal($value, $type, $small)
{
if($small)
return $value.' '.self::$TIME_AB***91;$type***93;;
else
return $value.' '.($value == 1 ? self::$TIME_SG***91;$type***93; : self::Plural(self::$TIME_PL***91;$type***93;, $value));
}
public function DTimeSimple($e)
{
// year month week day hour min sec
$barriers = array(31557600, 2629800, 604800, 86400, 3600, 60, 1);
$a = array(1, 3, 3, -1, 5, -1,-1);
$time = max($time, 1);
$count = count($barriers);
for($current_barrier = 3; $current_barrier < $count; ++$current_barrier)
{
if($time >= $barriers***91;$current_barrier***93;)
{
$d = $current_barrier;
$k = floor($e / $barriers***91;$d***93;);
if($a***91;$d***93; != -1)
{
$type = $a***91;$d***93;;
$time %= $barriers***91;$d***93;;
$j = floor($time / $barriers***91;$type***93;);
if($j > 0)
return self::TimeInternal($k, $d, true).' '.self::TimeInternal($j, $type, true);
}
return self::TimeInternal($k, $d, false);
}
}
return '(n/a)';
}
public function DTimeStrict($time, $useSmall = true)
{
$time = round($time, 1);
$x = '';
$barriers = array(31557600, 2629800, 604800, 86400, 3600, 60, 1);
for($i = 0; $i < count($barriers); $i++)
{
$barr = $barriers***91;$i***93;;
if($time >= $barr)
{
$time2 = floor($time / $barr);
if($time2 < 1)
continue;
$time %= $barr;
$x .= self::TimeInternal($time2, $i, $useSmall).' ';
}
}
return trim($x);
}
}
?>
Описание функций:
Simple Strict Format
Код:
Format::Simple(string $str, ...)
Оно же индексированный sprintf. Заменяет значениями аргументов конструкции $ + индекс аргумента. Т.е. Format::Simple('Two: $2 One: $1', 'one', 'two') => 'Two: two One: one'
Plural Format
Код:
Format::Plural(string $str, unsigned int $value)
Используется при локализации. Превращает коярвый русзкий в настоящий Русский Язык.
- Format::Plural('год:года:лет', '1') => 'год'
- Format::Plural('год:года:лет', '3') => 'года'
- Format::Plural('год:года:лет', '5') => 'лет'
Format Time Delta Simple
Код:
Format::DTimeSimple(unsigned int $time_delta)
Простое, читаемое, но не абсолютно точное отображение времени, обычно используется для дельты. Format:
TimeSimple(123) => '2 минуты' (хотя это на самом деле 2 минуты 3 секунды). Будет сокращать слова (минуты -> мин) если (максимум) 2 слова.
Format Time Delta Strict
Код:
Format::DTimeStrict(unsigned int $time_delta, bool $small = true)
Тоже самое что и DTimeSimple, но выводит время точно и поддерживает 2 аргумент для использования сокращенных слов (вкл по-умолчанию).
Код:
Format::DTimeStrict(123, false) => '2 минуты 3 секунды'
Format::DTimeStrict(123) => '2 мин 3 сек'