Показать сообщение отдельно
Старый 09.03.2010, 15:13   #19
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Раз уж начали про вывод времени, позвольте продолжить.

Неймспейс для 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 && $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 && $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 == 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(315576002629800604800864003600601);
        
$a        = array(1,        3,       3,      -1,    5,    -1,-1);
        
$time max($time1);
        
$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$dtrue).' '.self::TimeInternal($j$typetrue);
                }
                return 
self::TimeInternal($k$dfalse);
            }
        }
        return 
'(n/a)';
    }

    public function 
DTimeStrict($time$useSmall true)
    {
        
$time round($time1);
        
$x '';
        
$barriers = array(315576002629800604800864003600601);
        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 сек'
LordJZ вне форума   Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
DeusModus (09.03.2010), Gen1us2k (09.03.2010), Gerald (11.03.2010), Hantet (17.04.2010), KiriX (10.03.2010), rootor (09.03.2010)