钧言极客钧言极客

钧言极客

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

在看见别人的博客评论框显示着,几分钟前,几个天前的时间显示,而不是单纯的显示一个完整的时间。于是上网一通搜索,在大佬的博客找到方法。

编辑文件 var/Typecho/I18n.php 找到如下代码。

/**
* 词义化时间
*
* @access public
* @param string $from 起始时间
* @param string $now 终止时间
* @return string
*/
public static function dateWord($from, $now)
{
$between = $now - $from;
/** 如果是一天 */
if ($between >= 0 && $between < 86400 && date('d', $from) == date('d', $now)) {
/** 如果是一小时 */
if ($between < 3600) {
/** 如果是一分钟 */
if ($between < 60) {
if (0 == $between) {
return _t('刚刚');
} else {
return str_replace('%d', $between, _n('一秒前', '%d秒前', $between));
}
}
$min = floor($between / 60);
return str_replace('%d', $min, _n('一分钟前', '%d分钟前', $min));
}
$hour = floor($between / 3600);
return str_replace('%d', $hour, _n('一小时前', '%d小时前', $hour));
}
/** 如果是昨天 */
if ($between > 0 && $between < 172800 
&& (date('z', $from) + 1 == date('z', $now) // 在同一年的情况 
|| date('z', $from) + 1 == date('L') + 365 + date('z', $now))) { // 跨年的情况
 return _t('昨天 %s', date('H:i', $from));
}
/** 如果是一个星期 */
if ($between > 0 && $between < 604800) {
$day = floor($between / 86400);
return str_replace('%d', $day, _n('一天前', '%d天前', $day));
}
/** 如果是 */
if (date('Y', $from) == date('Y', $now)) {
return date(_t('Y年n月j日'), $from);
}
return date(_t('Y年m月d日'), $from);
}

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

/**
* 词义化时间
*
* @access public
* @param string $from 起始时间
* @param string $now 终止时间
* @return string
*/
public static function dateWord($from, $now)
{
$between = $now - $from;
/** 如果是一天 */
if ($between >= 0 && $between < 86400 && date('d', $from) == date('d', $now)) {
/** 如果是一小时 */
if ($between < 3600) {
/** 如果是一分钟 */
if ($between < 60) {
if (0 == $between) {
return _t('刚刚');
} else {
return str_replace('%d', $between, _n('刚刚', '%d秒前', $between));
}
}
$min = floor($between / 60);
return str_replace('%d', $min, _n('1分钟前', '%d分钟前', $min));
}
$hour = floor($between / 3600);
return str_replace('%d', $hour, _n('1小时前', '%d小时前', $hour));
}
/** 如果是昨天 */
if ($between > 0 && $between < 172800 
&& (date('z', $from) + 1 == date('z', $now)                             // 在同一年的情况 
|| date('z', $from) + 1 == date('L') + 365 + date('z', $now))) {    // 跨年的情况
return _t('昨天 %s', date('H:i', $from));
}
/** 如果是一个星期以内 */
if ($between > 0 && $between < 604800) {
$day = floor($between / 86400);
return str_replace('%d', $day, _n('1天前', '%d天前', $day));
}
/** 如果是一个星期以上 */
if ($between > 0 && $between < 2592000){
$week = floor($between / 648000);
return str_replace('%d', $week, _n('1周前', '%d周前', $week));
}
/** 如果是一年以内 */
if ($between > 0 && $between < 31557600){
$month = floor($between / 2629800);
return str_replace('%d', $month, _n('1个月前', '%d个月前', $month));
}
/** 如果是一年以上 */
if (date('Y', $from) == date('Y', $now)) {
return date(_t('Y年n月j日 H:i'), $from);
}
return date(_t('Y年m月d日 H:i'), $from);
}

食用方法

在你想要替换的地方寻找

<?php $comments->date(); ?>

修改为:

<?php $comments->dateWord(); ?>

感谢一下

文章来自:Ryongyon!

未经允许不得转载:钧言极客 » Typecho实现类似微博几分钟、几天前的词义化时间

评论 2

  1. 文章不错,顺利解决问题。

    柠檬    /  (2020-11-30) 回复