Разница во времени в словесной форме

23 Дек
2011

Понравилась мне идея выводить не просто дату создания например комментария, а выводить сколько прошло времени с момента создания комментария.

Реализовал я это в виде View Helper’a для Zend Framework‘a.


[nocrosspost]

/**
 *
 * @author Sergey Rulkov <webdev [@] rulkov.ru>
 */
 
class Zend_View_Helper_TextDateDiff extends Zend_View_Helper_Abstract
{
    protected $_hoursTitles = array('час', 'часа', 'часов');
    protected $_minuteTitles = array('минута', 'минуты', 'минут');
    protected $_secondTitles = array('секунда', 'секунды', 'секунд');

    protected $_yearTitles = array('год', 'года', 'лет');
    protected $_monthTitles = array('месяц', 'месяца', 'месяцев');
    protected $_dayTitles = array('день', 'дня', 'дней');

    protected $_format = '%s %s ';

    /**
     * Пункция вычисляет разницу между датами и возврщает разницу в словесной форме
     * @param string $firstDate
     * @param string $secondDate
     * @return string
     */
    public function TextDateDiff($firstDate, $secondDate = null)
    {
        $firstDate = new DateTime($firstDate);
        $secondDate = new DateTime($secondDate);
        $dateDiff = $firstDate->diff($secondDate);

        $resultString = '';

        if (($y = $dateDiff->y) > 0) $resultString .= sprintf($this->_format, $y, $this->intDeclination($y, $this->_yearTitles));
        if (($m = $dateDiff->m) > 0) $resultString .= sprintf($this->_format, $m, $this->intDeclination($m, $this->_monthTitles));
        if (($d = $dateDiff->d) > 0) $resultString .= sprintf($this->_format, $d, $this->intDeclination($d, $this->_dayTitles));
        if (($h = $dateDiff->h) > 0) $resultString .= sprintf($this->_format, $h, $this->intDeclination($h, $this->_hoursTitles));
        if (($i = $dateDiff->i) > 0) $resultString .= sprintf($this->_format, $i, $this->intDeclination($i, $this->_minuteTitles));
        if (($s = $dateDiff->s) > 0) $resultString .= sprintf($this->_format, $s, $this->intDeclination($s, $this->_secondTitles));

        return $resultString;
    }
    /**
     * @param string $number
     * @param array $titles
     * @return string
     */
    private function intDeclination($number, $titles)
    {
        if ($number == 0)
            return '';
        $cases = array(2, 0, 1, 1, 1, 2);
        return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[($number%10<5)?$number%10:5] ];
    }
}

В шаблоне теперь можно написать следующее:

С 11 декабря 1986 года прошло уже <?=$this->TextDateDiff('1986-12-11')?>

Получаемый результат

С 11 декабря 1986 года прошло уже 25 лет 12 дней 14 часов 28 минут 40 секунд

P.S. Работать будет только на php версии 5.3 и выше.
[/nocrosspost]

2 комментария к записи Разница во времени в словесной форме

Avatar

Михаил

25th Декабрь 2011 в 23:15

Значит тебе 25 лет 12 дней 14 часов 28 минут 40 секунд? )))

Avatar

Сергей

26th Декабрь 2011 в 09:51

Тип того 🙂

Оставить комментарий или два

Наверх
Rambler's Top100