I am trying to create a news feed, and as part of that I am wanting to display to the user how long it has been since the news article was published, something that would look like this,
Posted: 1 minute and 5 seconds ago
However all I am getting from my function is this,
40 years and 11 months ago
This is what I get whatever the time stamp I send to the function, the function that works out the time since posting,
function relativeTime($dt,$precision=2)
{
$times=array( 365*24*60*60 => "year",
30*24*60*60 => "month",
7*24*60*60 => "week",
24*60*60 => "day",
60*60 => "hour",
60 => "minute",
1 => "second");
$passed=time()-$dt;
if($passed<5)
{
$output='less than 5 seconds ago';
}
else
{
$output=array();
$exit=0;
foreach($times as $period=>$name)
{
if($exit>=$precision || ($exit>0 && $period<60)) break;
$result = floor($passed/$period);
//die($result);
if($result>0)
{
$output[]=$result.' '.$name.($result==1?'':'s');
$passed-=$result*$period;
$exit++;
}
else if($exit>0) $exit++;
}
$output=implode(' and ',$output).' ago';开发者_如何学运维
}
// die($output);
return $output;
}
$dt = the timestamp something that would look similar to this, 1292534103
In the format tweet function, I am able to get a value from $dt
, however when I pass $dt
to relativeTime from within the formatTweet function it returns as false, below are both functions,
function relativeTime($dt,$precision=2)
{
$times=array( 365*24*60*60 => "year",
30*24*60*60 => "month",
7*24*60*60 => "week",
24*60*60 => "day",
60*60 => "hour",
60 => "minute",
1 => "second");
$passed=time()-$dt;
if($passed<5)
{
$output='less than 5 seconds ago';
}
else
{
$output=array();
$exit=0;
foreach($times as $period=>$name)
{
if($exit>=$precision || ($exit>0 && $period<60)) break;
$result = floor($passed/$period);
//die($result);
if($result>0)
{
$output[]=$result.' '.$name.($result==1?'':'s');
$passed-=$result*$period;
$exit++;
}
else if($exit>0) $exit++;
}
$output=implode(' and ',$output).' ago';
}
// die($output);
return $output;
}
And the formatTweet function
function formatTweet($company_logo = '', $company_name = 'moovjob', $tweet, $dt)
{
if(is_string($dt)) $dt=strtotime($dt);
$tweet=htmlspecialchars(stripslashes($tweet));
//die(print_r($dt));
return'
<li><a href="#"><img class="avatar" src="/media/images/employers/'.$company_logo.'width="48" height="48" alt="avatar" /></a>
<div class="tweetTxt">
<strong><a href="#">'.$company_name.'</a></strong> '. preg_replace('/((?:http|https|ftp):\/\/(?:[A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?[^\s\"\']+)/i','<a href="$1" rel="nofollow" target="blank">$1</a>',$tweet).'
<div class="date">'.relativeTime($dt).'</div>
</div>
<div class="clear"></div>
</li>';
}
If you're using PHP 5.3 or newer, you can take advantage of the new Date and Time classes added to PHP.
Specifically, DateTime
has a diff
method that returns a DateInterval
class, which you can then format
.
are you sure that you send a value in $dt ?
40 years and 11 month ago sounds a lot like January 1st 1970, which is the beginning of the epoch time.
time() gives you the number of seconds since 1970 so if $dt=0 you get the result that you see.
Keep me posted after you do that check.
I hope this will help you,
Jerome Wagner
精彩评论