我在之前一篇《博客的一点小修改》提到过,参照万戈的一篇文章设置了相对时间显示,具体效果可以参看本博首页的文章时间显示。
其实后来我发现比较原版的代码是出现在《换个方式显示日志发表时间和回复时间》,据说是一个老外写的。如果你要显示中文的“XXX小时,XXX分钟之前”,可以直接到万戈那里(《WordPress 显示发布内容于多少时间前》)拷贝代码。万戈的代码是只显示小时分钟,超过24小时就按常规方式显示时间了。如果要显示天、周、年,则取消开头的数组中的代码注释,并修改if($since < 86400)中的数值,或者可以直接去掉这个判断语句(注意前后的{}也要去掉)。
如果你想要显示的是英文时间,如“XXXhours,XXXminutes ago”之类,则直接调用《换个方式显示日志发表时间和回复时间》一文中的代码即可。如果不想显示年、月之类,则直接注释掉数组中的
array(60 * 60 * 24 * 365 , 'year'),
array(60 * 60 * 24 * 30 , 'month'),
即可。附上我稍作修改的原版代码,主要是在最后返回时加了个判断,使之对于预发布日志也适用。因为预发布日志的时间大于当前时间,所以要显示“after XXX, XXXX”.
function time_since($older_date, $newer_date = false) {
$chunks = array(
array(60 * 60 * 24 * 365 , 'year'),
array(60 * 60 * 24 * 30 , 'month'),
array(60 * 60 * 24 * 7, 'week'),
array(60 * 60 * 24 , 'day'),
array(60 * 60 , 'hour'),
array(60 , 'minute'),
array(1 , 'second'),
);
$newer_date = ($newer_date == false) ? (time()+(60*60*get_settings("gmt_offset"))) : $newer_date;
$since = abs($newer_date - $older_date);
for ($i = 0, $j = count($chunks); $i < $j; $i++)
{
$seconds = $chunks[$i][0];
$name = $chunks[$i][1];
if (($count = floor($since / $seconds)) != 0)
{
break;
}
}
$output = ($count == 1) ? '1 '.$name : "$count {$name}s";
if ($i + 1 < $j)
{
$seconds2 = $chunks[$i + 1][0];
$name2 = $chunks[$i + 1][1];
if (($count2 = floor(($since - ($seconds * $count)) / $seconds2)) != 0)
{
$output .= ($count2 == 1) ? ', 1 '.$name2 : ", $count2 {$name2}s";
}
}
if ($newer_date - $older_date<0) {
return "after ".$output;
} else {
return $output." ago";
}
}
如果要实现诸如超过某段时间之后就按正常方式显示时间,则可以不必改变上面函数情况下,只需在调用时,加一个时间判断:用以下方式调用
/*$diff变量是时间段,单位是秒。如下面即是24小时,函数调用即是不超过24小时则调用time_since函数,否则调用the_time函数*/
<?php $diff=60*60*24;if (function_exists('time_since') && (time()-get_the_time('U'))<$diff) {
echo time_since(abs(strtotime($post->post_date_gmt . "GMT")), time());
} else {
the_time('Y-m-j G:i');
}
?>
另外,其实WordPress中也有一个相对时间函数,但是比较简单,只能显示XXX ago,即显示一组时间。这个函数是
human_time_diff( $from, $to)
调用如下
<?php echo human_time_diff(get_the_time('U'), current_time('timestamp')) . ' ago'; ?>
这个函数位于WordPress目录的include\formatting.php。相比于上面的函数,抛开显示效果来说,WordPress这个函数并不好。这个函数是完全通过if判断来实现的,功能只能显示“XXX days”或“XXXhours”或“XXXmins”。如果要自己去完善使之实现“XXX days, XXX mins”这样的两组时间,这个函数照这么写下去不知要写多少代码才算完结。至少我当初用if实现这个功能时就写了不下两百行。所以还是推荐大家用上面老外那个函数。