@ 2010.10.28 , 18:07

WordPress:timestamp 函数的时差(timezone)问题

[-]

# sein:这篇文章大多数同学可能没兴趣,不过作为一个 wp 折腾犯,我还是想把这点心得分享给大家。

最早发现这个时差问题是在我们首页添加24小时内热文(显示浏览最多十篇文章)后发现的,平时每天更新20-30篇,即使扣除8小时影响也不大,但在某个周末的最近24小时文章刚好够10篇时,它只显示几篇给我,当时就诧异了。当时没想过根源是 timestamp 函数,只是想简单 hack 一下就好,将 wp-postviews 插件里 get_timespan_most_viewed 函数中的

$limit_date = current_time('timestamp') - ($days*86400);

改为

$limit_date = current_time('timestamp') - ($days*86400) - 28800;

// 8小时就是 8x60x60=28800秒

所以今天在把我们首页第一篇文章的时间显示方式改为 xxx mins ago 时,8小时时差又出现了,于是毫不犹豫的暴力 hack 了,同样是把

<?php echo human_time_diff(get_the_time('U'), current_time('timestamp')) . ' ago'; ?>

改成

<?php echo human_time_diff(get_the_time('U'), current_time('timestamp') - 28800 ) . ' ago'; ?>

当然我这样指标不治本,有兴趣折腾的同学可以直接到 wp-includes/formatting.php 里修改 human_time_diff。就解决 human_time_diff 函数的 timezone 问题而言,我这个方法简单有效(网上N多老外哭求这个时差问题都没有答案,哈哈哈),但究其根源还是要解决 timestamp 函数的时差问题。

参考这里,有三种解决方案,其中比较简洁的一个是,在 wp-includes/functions.php 第66行

case 'timestamp':
return ( $gmt ) ? time() : time() + ( get_option( 'gmt_offset' ) * 3600 );
break;

下面添加

case 'timestampgmt':
return ( $gmt ) ? strtotime(gmdate("Y-m-d H:i:s")) : strtotime(gmdate("Y-m-d H:i:s")) + ( get_option( 'gmt_offset' ) * 3600 );
break;

然后再要用 timestamp 改用 timestampgmt 就好了。

# 注:请自行以上代码中的将全角引号改为半角

支付宝打赏 [x]
您的大名: 打赏金额:
赞一个 (2)