三月
20

有关WordPress显示相对日期时间的代码

我在之前一篇《博客的一点小修改》提到过,参照万戈的一篇文章设置了相对时间显示,具体效果可以参看本博首页的文章时间显示。

其实后来我发现比较原版的代码是出现在《换个方式显示日志发表时间和回复时间》,据说是一个老外写的。如果你要显示中文的“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实现这个功能时就写了不下两百行。所以还是推荐大家用上面老外那个函数。

本文标签: , , , ,

分享

本文短网址: http://qiqi.boy.im/8w

这篇文章已经有 2 条评论

Comments (1) Trackbacks (1)
You can leave a response or Trackback this entry .
  1. 童童家 -#1

  1. Hello WordPress!

    [...] 2010.03 我介绍了有关WordPress显示相对日期时间的代码,还分享了同步WordPress日志更新信息到twitter以及这个方法的更新版更新《同步WordPress日志更新信息到twitter》,添加标签信息同步 [...]

Leave a Reply

Hi , say something.

  • :?:
  • :razz:
  • :sad:
  • :evil:
  • :!:
  • :smile:
  • :oops:
  • :grin:
  • :eek:
  • :shock:
  • :???:
  • :cool:
  • :lol:
  • :mad:
  • :twisted:
  • :roll:
  • :wink:
  • :idea:
  • :arrow:
  • :neutral:
  • :cry:
  • :mrgreen: