Как в правильном падеже вывести прошедшее время между моментами (в зависимости от числительных) используя 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;
}
а код функции для формирования в правильном падеже слов месяц, год, секунда, час, неделя выложите?
например
прошло 2 минуты
прошло 11 минут
прошла 1 минута и т.д..
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;
}
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;
}
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) ? "года" : "лет"));
}
почему бы все это не собрать в одну функцию?
кстате обратите внимание если тайм зоны разные для php интерпритатора и mysql сервера,
то разница во времени не будет правильная,
или настраивайте одинаковую тайм зону или берите все данные из одного источника например из mysql сервера
function GetTimeFromMysqlServer()
{
$db = &$this->MyDb;
$TimeFromMysqlServer = $db->getOne('SELECT now()');
// echo $db->lastQuery();
return $TimeFromMysqlServer;
}
второе- при округлении количества дней в месяце возможен случая что согласно алгоритму будет возвращено , что прошло 0 месяцев, для этого добавьте определение точного кол-ва дней в определенном месяце
$days_in_month= cal_days_in_month(CAL_GREGORIAN, date('m', $timeinput), date('Y', $timeinput));
у вас в функции 24 и 30.1 это количество дней в месяце- это не верно, так как если в месяце другое количество дней, то функция возвращает прошло 0 месяцев....
нужно вместо этих чисел в трех местах заменить на настоящее количество дней в месяце определенного года на переменную $days_in_month
Комментарии
Оставить комментарий
Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)