2017-06-11 13:08:17 2147次浏览 5条回答 1 悬赏 10 金钱

官网发帖的个性化时间显示几分钟,几小时,1天前,2天前,超过2天好像就显示日期了。

Yii自带的有asRelativeTime,可以实现几分钟,几小时,几天前,但是也有个弊端就是一直这样显示,直到显示1年前,N年前。

想知道官网的这个是如何实现的?自定义的吗?还是Yii内置功能需要二次配置参数?

补充于 2017-06-11 13:09

老大看到求说下。谢谢。

最佳答案

  • ╃巡洋艦㊣ 发布于 2017-06-11 14:59 举报

    我用自己写的方法,如下:

    public static function date($format, $time)
    {
    	$limit = time() - $time;
    
    	if($limit < 10)
    		return '刚刚';
    
    	if($limit < 60)
    		return $limit . '秒前';
    
    	if($limit >= 60 && $limit < 3600)
    		return floor($limit/60) . '分钟前';
    
    	if($limit >= 3600 && $limit < 86400)
    		return floor($limit/3600) . '小时前';
    
    	if($limit >= 86400 and $limit<259200)
    		return floor($limit/86400) . '天前';
    
    	if($limit >= 259200)
    		return date($format,$time);
    }
    
    1 条回复
    回复于 2017-06-11 16:32 回复

    好吧,我以为Yii可以通过asRelativeTime参数配置达到该效果呢。

    , 觉得很赞
  • 回答于 2017-06-12 09:08 举报

    我的回答不是为了说明什么,就是为了说明 说的是最佳实践。Carbon解决这类问题简直不能再合适了

  • 回答于 2017-06-12 16:37 举报
    /**
     * 日期按时间单位返回
     * @param  integer  $epoch_event 要处理的时间戳
     * @param  integer $range       要处理的时间差,时间差以外的按日期格式返回
     * @param  integer $level       1.只返回最接近的时间单位
     * @return string
     */
    function time_ago($epoch_event, $range = 86400, $level = 1) {
        $time_ago = array();
        // $period = array('second', 'minute', 'hour', 'day', 'week', 'month', 'year', 'decade');
        $period = array('秒', '分', '小时', '天', '周', '月', '年', '十年');
        $difference = time() - $epoch_event;
        if ($difference >= $range) {
            return date('Y-m-d H:i');
        }
        if (($difference <= 59) && ($difference !== 0)) {
            $time_event = $difference / 1;
            return $time_event . $period[0] . '前';
        } elseif (($difference >= 60) && ($difference <= 3599)) {
            $time_event = $difference / 60;
            if (($difference % 60) === 0) {$add_time = '';}
            if (($difference % 60) !== 0) {$add_time = floor(($difference % 60) / 1) . $period[0];}
            if ($time_event === $level) {
                return $time_event . $period[1] . '前';
            } else {
                return floor($time_event) . $period[1] . $add_time . '前';
            }
        } elseif (($difference >= 3600) && ($difference <= 86399)) {
            $time_event = $difference / 3600;
            if (($difference % 3600) === 0) {$add_time = '';}
            if (($difference % 3600) !== 0) {$add_time = floor(($difference % 3600) / 60) . $period[1];}
            if ($time_event === $level) {
                return $time_event . $period[2] . '前';
            } else {
                return floor($time_event) . $period[2] . $add_time . '前';
            }
        } elseif (($difference >= 86400) && ($difference <= 604799)) {
            $time_event = $difference / 86400;
            if (($difference % 86400) === 0) {$add_time = '';}
            if (($difference % 86400) !== 0) {$add_time = floor(($difference % 86400) / 3600) . $period[2];}
            if ($time_event === $level) {
                return $time_event . $period[3] . '前';
            } else {
                return floor($time_event) . $period[3] . $add_time . '前';
            }
        } elseif (($difference >= 604800) && ($difference <= 2591999)) {
            $time_event = $difference / 604800;
            if (($difference % 604800) === 0) {$add_time = '';}
            if (($difference % 604800) !== 0) {$add_time = floor(($difference % 604800) / 86400) . $period[3];}
            if ($time_event === $level) {
                return $time_event . $period[4] . '前';
            } else {
                return floor($time_event) . $period[4] . $add_time . '前';
            }
        } elseif (($difference >= 2592000) && ($difference <= 31103999)) {
            $time_event = $difference / 2592000;
            if (($difference % 2592000) === 0) {$add_time = '';}
            if (($difference % 2592000) !== 0) {$add_time = floor(($difference % 2592000) / 604800) . $period[4];}
            if ($time_event === $level) {
                return $time_event . $period[5] . '前';
            } else {
                return floor($time_event) . $period[5] . $add_time . '前';
            }
        } elseif (($difference >= 31104000) && ($difference <= 311039999)) {
            $time_event = $difference / 31104000;
            if (($difference % 31104000) === 0) {$add_time = '';}
            if (($difference % 31104000) !== 0) {$add_time = floor(($difference % 86400) / 2592000) . $period[5];}
            if ($time_event === $level) {
                return $time_event . $period[6] . '前';
            } else {
                return floor($time_event) . $period[6] . $add_time . '前';
            }
        } elseif ($difference >= 311040000) {
            return $period[7] . '前';
        } else {
            return '刚刚'; // in case $epoch_event gets set to time();
        }
        return $time_ago;
    }
    
    1 条回复
    回复于 2017-06-12 16:37 回复

    写了一个更详细的

您需要登录后才可以回答。登录 | 立即注册
mydzoo
总监

mydzoo

注册时间:2017-01-05
最后登录:2022-03-29
在线时长:53小时40分
  • 粉丝4
  • 金钱2075
  • 威望10
  • 积分2705

热门问题