Класс для работы со временем

<?php 
/**
 
 * @name Класс для работы со временем
 
 * @author Скитч. ICQ: 2134410. 
 
 * @date  23.12.2011
 
 * @version  0.1
 
 */
 
class Mumbu_time{
<cut-->
           /**
    * длинные названия месяцов
    */
        private $monthlong = array('января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря');
        private $monthshort = array('янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек');
 
           /**
    * множественные формы слов
    */
        private $yearword = array('год', 'года', 'лет');
        private $monthword = array('месяц', 'месяца', 'месяцев');
        private $dayword = array('день', 'дней', 'дней');
        private $hourword = array('час', 'часа', 'часов');
        private $minuteword = array('минута', 'минуты', 'минут');
        private $secondword = array('секунда', 'секунды', 'секунд');
 
           /**
    * формат вывода даты
    */
        private $year = 'y';
        private $month = 'm';
        private $day = 'd';
        private $hour = 'H';
        private $minute = 'i';
        private $second = 's';
 
    /**
    * @param $tz - timezone.
    */
    function __construct($tz = null){
 
            if($tz == null)
 
            date_default_timezone_set('Europe/Moscow');
 
            else
 
            date_default_timezone_set($tz);
 
    }
 
    /**
    * Обрабатываем и выводим time()
    */
    public function get(){
 
            return time();
    }
 
    /**
    * Выводим время $fullmonth - полное название месяца
    */
    public function clock($time = null, $fullmonth = true){
 
                $time = ($time == null ? $this->get() : $time);
 
                $d = date($this->day, $time);
 
                $m = date($this->month, $time);
 
                $y = date($this->year, $time);
                    
                $m = ($fullmonth ? $this->monthlong[$m - 1] : $this->monthshort[$m - 1]);
 
                $full_time = $d.' '.$m.' '.$y.' в '.date(($this->hour != null ? $this->hour.':' : null) . ($this->minute != null ? ($this->hour == null ? ':' : null) . $this->minute : null), $time);
 
                 $date = date('d.m.Y', $time);
 
                 $time = date('H:i', $time);
 
                 if($date == date('d.m.Y')) $full_time = date('Сегодня в H:i', $time);
 
                 if($date == date('d.m.Y', time()-60*60*24)) $full_time = date('Вчера в H:i', $time);
 
                 return $full_time;
    }
 
           /**
    * Время с момента
    */
    public function time_ago($time= null){
 
             #$ltime = $this->get() - $time;
             $ltime = ($time == null ? $this->get() : $time) - $time;
 
             if($ltime < 5){ return 'только что'; 
                }elseif($ltime < 60){ return $ltime.' '.$this->plural_form($ltime, 'секунду', 'секунды', 'секунд').''; 
             }elseif($ltime < 3600){ return round($ltime/60).' '.$this->plural_form(round($ltime/60), 'минуту', 'минуты', 'минут');
             }elseif($ltime < 86400){ return round($ltime/3600).' '.$this->plural_form(round($ltime/3600), 'час', 'часа', 'часов');
             }elseif($ltime > 1814400){ return $this->clock($ltime);
             }elseif($ltime > 604800){ return round($ltime/604800).' '.$this->plural_form(round($ltime/86400), 'неделю', 'недели', 'недель');
             }elseif($ltime > 86400){ return round($ltime/86400).' '.$this->plural_form(round($ltime/86400), 'день', 'дня', 'дней'); 
                }
 
    }
 
           /**
    * Обратный отсчёт
 
        * @var early - время от которого начинается отсчет
 
        * @var later - время до которого идет отсчет
 
        * @param enclosure - вложенность вывода
    */
    public function backtime($early, $later = null, $enclosure = 5){
 
                        $out = '';
 
                        $count = 0;
 
                        if ($later == null)
 
                $later = $this->get();
 
                $year = abs(date('y', $later) - date('y', $early));
 
                if($year > 0){
 
                if($enclosure != 0 and $count < $enclosure) {
 
                ++$count;
 
                $out .= $year.' '.$this->plural_form($year, $this->yearword);
                }
    }
 
                $month = abs(date('m', $later) - date('m', $early));
 
                if($month != 0){
 
                if($enclosure != 0 and $count < $enclosure) {
 
                ++$count;
 
                $out .= ' '.$month.' '.$this->plural_form($month, $this->monthword);
                }
        }
 
                $day = abs(date('d', $later) - date('d', $early));
 
                if($day > 0){
 
                if($enclosure != 0 and $count < $enclosure) {
 
                ++$count;
 
                $out .= ' '.$day.' '.$this->plural_form($day, $this->dayword);
                }
        }
 
                $hour = abs(date('H', $later) - date('H', $early));
 
                if($hour > 0){
 
                if($enclosure != 0 and $count < $enclosure) {
 
                ++$count;
 
                $out .= ' '.$hour.' '.$this->plural_form($hour, $this->hourword);
 
                }
        }
 
                $minute = abs(date('i', $later) - date('i', $early));
 
                if($minute > 0) {
 
                if($enclosure != 0 and $count < $enclosure) {
 
                ++$count;
 
                $out .= ' '.$minute.' '.$this->plural_form($minute, $this->minuteword);
 
                }
        }
 
                $second = abs(date('s', $later) - date('s', $early));
 
                if($second > 0) {
 
                if($enclosure != 0 and $count < $enclosure) {
 
                $out .= ' '.$second.' '.$this->plural_form($second, $this->secondword);
 
                }
        }
 
        return $out;
 
    }
 
           /**
    * Форма множественного числа
    */
    private function plural_form($num, $array){
 
                        $q = ($num % 10 == 1 && $num % 100 != 11 ? 0 : ($num % 10 >= 2 && $num % 10 <= 4 &&
 
                        ($num % 100 < 10 or $num % 100 >= 20) ? 1 : 2));
 
                        return ($q == 0 ? $array[0] : ($q == 1 ? $array[1] : ($q == 2 ? $array[2] : null)));
    }
 
 
}
?>


Использовать:

INPUT:
$time = new Mumbu_time(); 
echo 'До Нового года осталось: '.$time->backtime(mktime(23,59,59,12,31,2011));

OUTPUT:
До Нового года осталось: 11 месяцев 5 дней 1 час 47 минут 59 секунд 


INPUT:
$time = new Mumbu_time(); 
echo $time->clock();

OUTPUT:
26 Января 11 в 22:14