@ 2010.10.28 , 18:07
46

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

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]
您的大名: 打赏金额:

0.0
赞一个 (1)

TOTAL COMMENTS: 46+1

  1. 630050

    真的没兴趣…

    OO [0] XX [0]
  2. basker
    @6 years ago
    630068

    这是神马玩意

    OO [0] XX [0]
  3. 小浮
    @6 years ago
    630074

    GEEK男sein

    OO [22] XX [0]
  4. ivanchaos
    @6 years ago
    630075

    最简单的解决办法:
    城管大军统一全世界……全球使用北京时间……problem solved!

    OO [12] XX [0]
  5. 630077

    只给美国人用的吗?有时差

    OO [0] XX [0]
  6. 630117

    = =b TP无压力

    OO [0] XX [0]
  7. BaaaaaL
    @6 years ago
    630118

    哥们儿,你到底在自娱自乐个什么啊?

    OO [18] XX [2]
  8. 630119

    刚刚知道神马是f(x)的人表示看不懂……听说同年龄袋鼠国的学生在学四舍五入==

    OO [4] XX [0]
  9. zoy&Moo
    @6 years ago
    630123

    最近也在研究 wordpress 在竭尽全力COPY一个煎蛋网!

    OO [0] XX [0]
  10. 630124

    本文回复果然很少

    OO [0] XX [0]
  11. 井底之蛙
    @6 years ago
    630150

    这算是技术贴么

    OO [0] XX [0]
  12. 巴拉莱卡
    @6 years ago
    630152

    完全不懂

    OO [0] XX [0]
  13. 630160

    技术帝!

    OO [0] XX [0]
  14. 630166

    地球人表示:这家伙境界太高看不懂的说。呃 希望这孩子没什么事。

    OO [2] XX [0]
  15. 630169

    对php了解不多的人飘过

    OO [0] XX [0]
  16. 鸡蛋
    @6 years ago
    630175

    貌似北京时间还算好办的,因为没有夏令时问题。其他时区的网管们每年总有那么令人心烦的一两天~

    OO [6] XX [0]
  17. 小黑一坨坨
    @6 years ago
    630177

    虽然说什么看不懂,但对说的人突然萌了…

    OO [0] XX [0]
  18. 吧唧
    @6 years ago
    630202

    好多年以前的煎蛋,就是这个风格的。真怀念啊~~
    虽然很多年过去了,我依然看不懂……

    OO [0] XX [0]
  19. 吧唧
    @6 years ago
    630207

    而且以前回复里是层出不穷花样翻新让人拍案的GEEK点子 我只是在心里默默地念叨看不懂看不懂,然后星星眼地看着那些geek嗨皮地交流着火星语

    OO [0] XX [0]
  20. 630222

    嘛叫函数??

    OO [0] XX [0]
  21. areyoucrazy
    @6 years ago
    630233

    我咋觉得差不多呢……你每次用current_time函数要么要改参数,要么不改参数修改返回值……

    OO [0] XX [0]
  22. secretblue
    @6 years ago
    630235

    同 小浮,同吧唧。
    一直以来,我对煎蛋的各位主编大人,都带有一点点莫名的崇拜……

    OO [0] XX [0]
  23. 出埃及
    @6 years ago
    630240

    哦哦 寒数就是冷漫环节

    OO [0] XX [0]
  24. 蛋丁二世
    @6 years ago
    630259

    网上N多个老外苦求答案…..

    OO [0] XX [0]
  25. 630280

    @吧唧: 老朋友了啊,握手~

    @蛋丁二世: 是的,希望他们懂中文。。

    OO [0] XX [0]
  26. 630347

    自娱自乐很好,表扬

    OO [0] XX [0]
  27. 笨猫猫
    @6 years ago
    630351

    我理解不能 因为我还没碰到时差问题 貌似就没这个问题

    OO [0] XX [0]
  28. kimson
    @6 years ago
    630355

    我刚才仔细看了一下,我来的是煎蛋啊………..

    OO [4] XX [0]
  29. 630360

    ? 错屏了?

    OO [0] XX [0]
  30. 630367

    没学过反馈?

    OO [0] XX [0]
  31. 黑白
    @6 years ago
    630383

    盯着这张图想了半天,似乎在哪里见过,但记不起来,关了煎蛋,恍然大悟,原来我现在用的桌面就是它

    OO [0] XX [0]
  32. 630394

    玛雅人说,嗯,当年我们也是这么算的….

    OO [2] XX [0]
  33. 630407

    用别的服务器对时间如何?当X服务器到达X时间就强制显示。

    OO [0] XX [0]
  34. 630450

    @黑白:
    thinkpad的默认桌面啊。。我的也是。。握手

    OO [0] XX [0]
  35. rosses
    @6 years ago
    630466

    这是考研的题吗?

    OO [0] XX [0]
  36. 630480

    php,太过专业化
    有没有试过用
    ini_set(‘date.timezone’, ‘Asia/Shanghai’);
    来解决?

    OO [0] XX [0]
  37. 火星
    @6 years ago
    630483

    $days*86400
    —第一反应是sein每天86400美刀的收入…

    OO [1] XX [0]
  38. 塔塔妈
    @6 years ago
    630581

    可怕

    OO [0] XX [0]
  39. 630589

    话说,在头文件里加句(这里不能用北京额~)
    date_default_timezone_set(“Asia/Shanghai”);
    一切就解决了。ini_set貌似也可以。

    OO [0] XX [0]
  40. 630616

    @grom: @yukon: 赞,有空我试试

    OO [0] XX [0]
  41. Lancer
    @6 years ago
    630828

    真的很沒性趣…

    OO [0] XX [0]
  42. ivxzhao
    @6 years ago
    631193

    @oioi:
    这个,用的是国际标准时吧~8小时的时差离米国远着咧

    OO [0] XX [0]
  43. 631420

    美国是12小时啊……

    OO [0] XX [0]
  44. 青椒肉丝兔
    @6 years ago
    677451

    :-)

    OO [0] XX [0]
  45. 蓝莓绿茶
    @6 years ago
    685274

    这个帖子相当给力!我的问题终于解决了

    OO [0] XX [0]
  46. 郭百度
    @4 years ago
    1791700

    给力!

    OO [0] XX [0]

发表评论


24H最赞