php class RussianDateTime extends DateTime public function localFormat

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
class RussianDateTime extends DateTime {
public function localFormat($format) {
$oldLocale = setlocale(LC_ALL, NULL);
setlocale(LC_ALL, 'ru_RU');
$time = parent::format('U');
$formated = strftime($format, $time);
setlocale(LC_ALL, $oldLocale);
return $formated;
}
public function formatRelative() {
$time = $this->format('U');
$diff = time() - $time;
if($diff == 0) {
return 'сейчас';
} else if ($diff > 0) {
$today = $time > mktime(0, 0, 0);
if ($today) {
if($diff < 60) return 'только что';
if($diff < 120) return 'минуту назад';
if($diff < 3600) return $this->declension(floor($diff / 60), array('минуту назад', 'минуты назад', 'минут назад'));
return 'сегодня в '.$this->format('H:i');
}
// mktime(0, 0, 0)
$past_time = mktime(0, 0, 0, date('n', $time), date('j', $time), date('Y', $time));
$days_before = floor((mktime(0, 0, 0) - $past_time) / (3600*24));
if ($days_before == 1) return 'вчера в '.$this->format('H:i');
if ($days_before < 7) return $this->declension($days_before, array('день назад', 'дня назад', 'дней назад')).' в '.$this->format('H:i');
}
return $this->format('d.m.Y H:i');
}
// слово слова слов
private function declension($number, $words) {
$cases = array(2, 0, 1, 1, 1, 2);
return $number.' '.$words[($number % 100 > 4 && $number % 100 < 20 ? 2 : $cases[min($number % 10, 5)])];
}
}
?>