[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вычисление и склонение даты поста
Кир
Скажите пожалуйста, можно ли где-то найти готовую функцию отображения даты поста в обратном формате? т.е. чтобы писалось "Добавлено час назад" или "Добавлено 2 дня назад" или 2 недели назад, год назад, 10 лет назад)



Спустя 1 час, 37 минут, 31 секунда (7.07.2010 - 23:07) .:JIexa:. написал(а):
а самому написать никак?
Я новичек и подсказать самый рациональны способ написания подобной функции не могу, но первое, что мне пришло в голову - фунция time() ... она выводит время в количестве секунд c начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT) до текущего времени.
Так вот если записывать время добавления поста, а потом вычислять разницу во времени относительно текущего времени. То получишь количество прошедших секунд с момента добавления поста.
Потом на основе этого сочинить вывод ...

Спустя 27 минут, 40 секунд (7.07.2010 - 23:35) Кир написал(а):
с вычислением прошедшего времени проблем нет, не знаю как разбить это на минуты, часы, дни, недели, месяцы и просклонять в зависимости от времени

Спустя 51 минута, 47 секунд (8.07.2010 - 00:27) kirik написал(а):
Цитата (Кир @ 7.07.2010 - 15:35)
не знаю как разбить это на минуты, часы, дни, недели, месяцы и просклонять

В одной минуте 60 секунд, в часе - 60 минут, в сутках - 24 часа, в неделе 7 суток, в месяце 30 дней (для ровного счета).. итд..
Склонения:
Добавлено 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 (секунд/минут/часов) назад
...
Отсюда можно проследить некую закономерность: если число оканчивается на 1 (но не 11), то окончание [секунду/минуту/час]; если число оканчивается на 2-4 (но не 12-14) то [секунды/минуты/часа]; ну а все остальные варианты имеют окончание [секунд/минут/часов].
Как-то так.. smile.gif

PS. вообще это называется "plural forms" и если лень писать, то можешь поискать готовое решение (где-то видел решение в одну строчку).

Спустя 3 минуты, 44 секунды (8.07.2010 - 00:30) Кир написал(а):

public function convert_datetime($str)
{
list($date, $time) = explode(' ', $str);
list($year, $month, $day) = explode('-', $date);
list($hour, $minute, $second) = explode(':', $time);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);

return $this->makeAgo($timestamp);
}

public function makeAgo($timestamp)
{
$difference = time() - $timestamp;
$periods = array("секунда", "минута", "час", "день", "неделя", "месяц", "год", "десятилетие");
$lengths = array("60","60","24","7","4.35","12","10");
for($j = 0; $difference >= $lengths[$j]; $j++)
$difference /= $lengths[$j];
$difference = round($difference);

return $text = "$difference $periods[$j] назад";
}

ну у меня пока только такой вариант)

Цитата
где-то видел решение в одну строчку

хотел бы взглянуть))

П.с. кажется нашел в инете 2 решения, завтра буду пробовать, при успехе отпишусь)

Спустя 1 месяц, 2 дня, 16 часов, 43 минуты, 43 секунды (10.08.2010 - 17:14) uWeb написал(а):
Ссылки на решения.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.