Итак, у меня есть этот рабочий код, который преобразует дату MySQL в метку времени UNIX и вычитает ее из текущей даты (), чтобы показать «время, прошедшее с X» -подобного таймера. (часть, которая берет дату из базы данных, отсутствует, так как она находится в другом скрипте)
<?php
function time_elapsed($secs){
$bit = array(
' year' => $secs / 31556926 % 12,
' week' => $secs / 604800 % 52,
' day' => $secs / 86400 % 7,
' hour' => $secs / 3600 % 24,
' minute' => $secs / 60 % 60,
' second' => $secs % 60
);
foreach($bit as $k => $v){
if($v > 1)$ret[] = $v . $k . 's';
if($v == 1)$ret[] = $v . $k;
}
array_splice($ret, count($ret)-1, 0, 'and');
$ret[] = 'ago.';
return join(' ', $ret);
}
$nowtime = time() + 10; //add 10s to avoid error
$oldtime = strtotime($mysqltime2);
$time_elapsed = time_elapsed($nowtime-$oldtime)."\n";
echo wordwrap($time_elapsed,35,"<br />\n"); //split long line
?>
Мне удалось исправить сообщение об ошибке отсутствующего массива или чего-то еще, если сценарий был выполнен одновременно с датой MySQL, добавив 10 секунд к текущей отметке времени.
Другая проблема, с которой я столкнулся, заключается в том, что скрипт показывает «и X секунд», даже если до него нет минут / часов / дней / и т.д.
Например.
«а также X секунд «» Y минут а также X секунд «» Z часов Y минут а также X секунд «» N дней Z часов Y минут а также Х секунд «
Я хочу удалить «и» ТОЛЬКО до секунд, если до него нет минут / часов / и т.д.
Любой совет, как это исправить?
Вы можете сращивать только при необходимости:
if( count($ret) > 1 ) {
array_splice($ret, count($ret)-1, 0, 'and');
}
Не уверен, что это поможет, но почему бы не сделать большую часть математики даты в MySQL?
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
Вот кое-что, что я сделал прежде, чтобы вывести список сообщений в разделе комментариев на сайте, он выводит «сообщение сделано 2 часа назад» и т. Д.
SQL:
UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(made_on) as madeon
PHP (перейдите от запроса к здесь):
function seconds_to_textual_time_ago($seconds)
{
$hour = 60* 60;
$day = 24 * $hour;
$month = 30 * $day;
$year = 365 * $day;
switch(true)
{
case ($seconds < 60) :
$time_ago = "Less than 1 minute ago";
break;
case ($seconds >= 60 && $seconds < $hour):
$minutes = floor($seconds /60);
if ($minutes > 1)
$time_ago = "$minutes minutes ago";
else
$time_ago = "1 minute ago";
break;case ($seconds >= $hour && $seconds < $day):
$hours = floor($seconds /$hour);
if ($hours > 1)
$time_ago = "$hours hours ago";
else
$time_ago = "1 hour ago";
break;case ($seconds >= $day && $seconds < $month):
$days = floor($seconds /$day);
if ($days > 1)
$time_ago = "$days days ago";
else
$time_ago = "1 day ago";
break;case ($seconds >= $month && $seconds < $year):
$months = floor($seconds /$month);
if ($months > 1)
$time_ago = "$months months ago";
else
$time_ago = "1 month ago";
break;
case ($seconds >= $year ):
$years = floor($seconds /$year);
if ($years > 1)
$time_ago = "$years years ago";
else
$time_ago = "1 year ago";
break;default:
break;
}
return $time_ago;
}
Самое простое, о чем я могу думать, это
$time_elapsed = time_elapsed($nowtime-$oldtime))."\n";
if($nowtime-$oldtime < 61){
$time_elapsed=str_replace('and ',' ',$time_elapsed);
}