avatar

Как в правильном падеже вывести прошедшее время между моментами (в зависимости от числительных)используя PHP

Рейтинг 4 из 5. Голосов: 230
Den 7 лет назад
7
,

0


Ответы (7)

Den
avatar
Модератор За 6 месяцев на форуме За год на форуме За два года на форуме за 10 сообщений За 100 сообщений за 500 сообщений За 700 сообщений №1 по сообщениям
1026 Mar 10
7 лет назад
Как в правильном падеже вывести прошедшее время между моментами (в зависимости от числительных) используя PHP
отправить
+ 0

Redy
avatar
За 6 месяцев на форуме За год на форуме За два года на форуме за 10 сообщений За 100 сообщений за 500 сообщений
503 Mar 10
7 лет назад
вот функция определения прошедшего времени от текущего момента до заданного
PHP:
function GetValidTime( $year,$month, $day,$h,$m,$s) { $interval = time() - mktime($h,$m,$s,$month, $day, $year); $interval = round($interval/60*60); if($interval < 60) $time = "$interval ".time_valid($interval, 's')." назад"; else if(($interval = intval($interval/60)) < 60) $time = "$interval ".time_valid($interval, 'm')." назад"; else if(($interval = intval($interval/60)) < 24) $time = "$interval ".time_valid($interval, 'h')." назад"; else if(($interval = intval($interval/24)) < 14) $time = $interval." " .GetValidDay($interval)." назад"; else if(($weeks= intval($interval/7)) < 4) $time = "$weeks недели назад"; else if(($months= intval($interval/30.4)) < 12) $time = "$months ".$this->time_valid($months, 'M')." назад"; else if(($years= intval($interval/365)) < 365) $time = $years." ".GetValidYear($years)." назад" ; return $time; }
отправить
+ 0

Den
avatar
Модератор За 6 месяцев на форуме За год на форуме За два года на форуме за 10 сообщений За 100 сообщений за 500 сообщений За 700 сообщений №1 по сообщениям
1026 Mar 10
7 лет назад
а код функции для формирования в правильном падеже слов месяц, год, секунда, час, неделя выложите? например прошло 2 минуты прошло 11 минут прошла 1 минута и т.д..
отправить
+ 0

Redy
avatar
За 6 месяцев на форуме За год на форуме За два года на форуме за 10 сообщений За 100 сообщений за 500 сообщений
503 Mar 10
7 лет назад
PHP:
function GetValidDay($daysCount) { $daysCount = (string)abs($daysCount); $daysCase = "дней"; $lastChar = $daysCount[iconv_strlen($daysCount) - 1]; if (iconv_strlen($daysCount) >= 2 && $daysCount[iconv_strlen($daysCount) - 2] == '1') { // 10-19 дней } else if ($lastChar == '1') { // 1, 21, 31 день $daysCase = "день"; } else if ($lastChar == '2' || $lastChar == '3' || $lastChar == '4') { // 2, 3, 4, 22, 33, 44 дня $daysCase = "дня"; } return $daysCase; }
PHP:
function time_valid($time, $period) { $arr['s'] = array('секунда', 'секунды', 'секунд'); $arr['m'] = array('минута', 'минуты', 'минут'); $arr['h'] = array('час', 'часа', 'часов'); $arr['d'] = array('день', 'дня', 'дней'); $arr['M'] = array('месяц', 'месяца', 'месяцев'); $arr['Y'] = array('год', 'года', 'лет'); $arr['Y2'] = array('года', 'лет', 'лет'); $time_abs = abs($time); $time_abs = intval(substr($time_abs, -2)); if ($time_abs > 19) $time_abs = intval(substr($time_abs, -1)); $sec_arr[0] = array(2,3,4); $sec_arr[1] = array(0,5,6,7,8,9); if ($time_abs == 1) $ret = $arr[$period][0]; else if (in_array($time_abs, $sec_arr[0])) $ret = $arr[$period][1]; else if (($time_abs >= 5 AND $time_abs <= 20) OR $time_abs == 0) $ret = $arr[$period][2]; return $ret; }
PHP:
function GetValidYear($year) { $year = abs($year); $t1 = $year % 10; $t2 = $year % 100; return ($t1 == 1 && $t2 != 11 ? "год" : ($t1 >= 2 && $t1 <= 4 && ($t2 < 10 || $t2 >= 20) ? "года" : "лет")); }
отправить
+ 0

Den
avatar
Модератор За 6 месяцев на форуме За год на форуме За два года на форуме за 10 сообщений За 100 сообщений за 500 сообщений За 700 сообщений №1 по сообщениям
1026 Mar 10
7 лет назад
почему бы все это не собрать в одну функцию?
отправить
+ 0

Redy
avatar
За 6 месяцев на форуме За год на форуме За два года на форуме за 10 сообщений За 100 сообщений за 500 сообщений
503 Mar 10
7 лет назад
кстате обратите внимание если тайм зоны разные для php интерпритатора и mysql сервера,то разница во времени не будет правильная,или настраивайте одинаковую тайм зону или берите все данные из одного источника например из mysql сервера
CODE:
function GetTimeFromMysqlServer(){$db = &$this->MyDb;$TimeFromMysqlServer = $db->getOne('SELECT now()');// echo $db->lastQuery();return $TimeFromMysqlServer;}
второе- при округлении количества дней в месяце возможен случая что согласно алгоритму будет возвращено , что прошло 0 месяцев, для этого добавьте определение точного кол-ва дней в определенном месяце
CODE:
$days_in_month= cal_days_in_month(CAL_GREGORIAN, date('m', $timeinput), date('Y', $timeinput));
отправить
+ 0

Den
avatar
Модератор За 6 месяцев на форуме За год на форуме За два года на форуме за 10 сообщений За 100 сообщений за 500 сообщений За 700 сообщений №1 по сообщениям
1026 Mar 10
6 лет назад
у вас в функции 24 и 30.1 это количество дней в месяце- это не верно, так как если в месяце другое количество дней, то функция возвращает прошло 0 месяцев.... нужно вместо этих чисел в трех местах заменить на настоящее количество дней в месяце определенного года на переменную $days_in_month
отправить
+ 0


Чтобы оставить комментарий войдите или зарегистрируйтесь