Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

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

Практика




Как в правильном падеже вывести прошедшее время между моментами (в зависимости от числительных) используя 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
создано: 2013-04-04
обновлено: 2021-03-13
132494



Рейтиг 10 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)

Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)