Typecho实现类似微博几分钟、几天前的词义化时间

事情是这样的,刚开始折腾Typecho的时候呢,想把评论框的时间显示成类似微博的 “几秒前” "几分钟前" "几天前"这样的词义化时间,但是却毫无头绪,于是到SegmentFault看到了这么一篇文章 《分钟前,小时前,天前,个月前,年前如何实现》,里面提供了好几种方案,但我不是很喜欢。突然我发现一个细节,在Typecho的后台,很多地方都是用这种 “XX前” 的词义化时间显示的,简单明了。从这里我们就可以得出,后台是有相关函数,我们只要找到,然后直接使用就可以了,So easy。于是我就开始翻后台文件,终于在 var/Typecho/I18n.php 找到了,代码如下:

  1. /**
  2. * 词义化时间
  3. *
  4. * @access public
  5. * @param string $from 起始时间
  6. * @param string $now 终止时间
  7. * @return string
  8. */
  9. public static function dateWord($from, $now)
  10. {
  11. $between = $now - $from;
  12. /** 如果是一天 */
  13. if ($between >= 0 && $between < 86400 && date('d', $from) == date('d', $now)) {
  14. /** 如果是一小时 */
  15. if ($between < 3600) {
  16. /** 如果是一分钟 */
  17. if ($between < 60) {
  18. if (0 == $between) {
  19. return _t('刚刚');
  20. } else {
  21. return str_replace('%d', $between, _n('一秒前', '%d秒前', $between));
  22. }
  23. }
  24. $min = floor($between / 60);
  25. return str_replace('%d', $min, _n('一分钟前', '%d分钟前', $min));
  26. }
  27. $hour = floor($between / 3600);
  28. return str_replace('%d', $hour, _n('一小时前', '%d小时前', $hour));
  29. }
  30. /** 如果是昨天 */
  31. if ($between > 0 && $between < 172800
  32. && (date('z', $from) + 1 == date('z', $now) // 在同一年的情况
  33. || date('z', $from) + 1 == date('L') + 365 + date('z', $now))) { // 跨年的情况
  34. return _t('昨天 %s', date('H:i', $from));
  35. }
  36. /** 如果是一个星期 */
  37. if ($between > 0 && $between < 604800) {
  38. $day = floor($between / 86400);
  39. return str_replace('%d', $day, _n('一天前', '%d天前', $day));
  40. }
  41. /** 如果是 */
  42. if (date('Y', $from) == date('Y', $now)) {
  43. return date(_t('Y年n月j日'), $from);
  44. }
  45. return date(_t('Y年m月d日'), $from);
  46. }

但是我发现官方提供的代码没有“周”和“月”,所以我动手完善了一下代码,添加了“周”和“月”,只有1年以及1年以上的时间才会显示完整时间。这样可能比较好点吧~ 可以自行考虑修改。完善后的代码如下:

  1. /**
  2. * 词义化时间
  3. *
  4. * @access public
  5. * @param string $from 起始时间
  6. * @param string $now 终止时间
  7. * @return string
  8. */
  9. public static function dateWord($from, $now)
  10. {
  11. $between = $now - $from;
  12. /** 如果是一天 */
  13. if ($between >= 0 && $between < 86400 && date('d', $from) == date('d', $now)) {
  14. /** 如果是一小时 */
  15. if ($between < 3600) {
  16. /** 如果是一分钟 */
  17. if ($between < 60) {
  18. if (0 == $between) {
  19. return _t('刚刚');
  20. } else {
  21. return str_replace('%d', $between, _n('刚刚', '%d秒前', $between));
  22. }
  23. }
  24. $min = floor($between / 60);
  25. return str_replace('%d', $min, _n('1分钟前', '%d分钟前', $min));
  26. }
  27. $hour = floor($between / 3600);
  28. return str_replace('%d', $hour, _n('1小时前', '%d小时前', $hour));
  29. }
  30. /** 如果是昨天 */
  31. if ($between > 0 && $between < 172800
  32. && (date('z', $from) + 1 == date('z', $now) // 在同一年的情况
  33. || date('z', $from) + 1 == date('L') + 365 + date('z', $now))) { // 跨年的情况
  34. return _t('昨天 %s', date('H:i', $from));
  35. }
  36. /** 如果是一个星期以内 */
  37. if ($between > 0 && $between < 604800) {
  38. $day = floor($between / 86400);
  39. return str_replace('%d', $day, _n('1天前', '%d天前', $day));
  40. }
  41. /** 如果是一个星期以上 */
  42. if ($between > 0 && $between < 2592000){
  43. $week = floor($between / 648000);
  44. return str_replace('%d', $week, _n('1周前', '%d周前', $week));
  45. }
  46. /** 如果是一年以内 */
  47. if ($between > 0 && $between < 31557600){
  48. $month = floor($between / 2629800);
  49. return str_replace('%d', $month, _n('1个月前', '%d个月前', $month));
  50. }
  51. /** 如果是一年以上 */
  52. if (date('Y', $from) == date('Y', $now)) {
  53. return date(_t('Y年n月j日 H:i'), $from);
  54. }
  55. return date(_t('Y年m月d日 H:i'), $from);
  56. }

嗯...说了一堆废话,还是直接抛出食用方法吧。

编辑文件→comments.php 找到以下代码:

  1. <time class="comment-time"><?php $comments->date(); ?></time>

修改为:

  1. <time class="comment-time"><?php $comments->dateWord(); ?></time>

文章来源:https://www.ryongyon.com/typecho-to-achieve-a-similar-microblog-a-few-minutes-a-few-days-ago-the-meaning-of-time.html

文章由官网发布,如若转载,请注明出处:https://www.veimoz.com/151
0 评论
3.7k

发表评论

!