php时间区间,优化显示

<?php
/**
 * 类似微信的时间显示
 * 规则是:今天的,显示几秒前,几分钟前,几小时前,昨天的显示昨天 上午 XX:XX 
 * 再往前,本周的,显示周几+时间,再往前,本年的,显示月日+时间,再往前,显示年月日+时间
 * User: tu6ge
 * Date: 2016/7/21
 * Time: 15:21
 */



function timespan($time){
    $the_day_time = strtotime(date('Y-m-d',$time));
    $one_day_second = $time-$the_day_time;
    if($one_day_second<3600*6){
        $pre_name = '凌晨';
    }elseif($one_day_second<3600*12){
        $pre_name = '上午';
    }elseif($one_day_second<3600*18){
        $pre_name = '下午';
    }else{
        $pre_name = '晚上';
    }
    $now_time = time();
    $today_time = strtotime(date('Y-m-d'));
    $yesterday_time = $today_time-86400;
    $now_week = date('w',$now_time);
    $now_week==0 && $now_week=7;
    $now_week_time = $today_time-($now_week-1)*86400;
    $now_year_time = strtotime(date('Y-01-01'));

    $the_week = date('w',$time);
    $the_week==0 && $the_week=7;
    $week_pre_name = '';
    switch ($the_week){
        case 1:
            $week_pre_name = '一';
            break;
        case 2:
            $week_pre_name = '二';
            break;
        case 3:
            $week_pre_name = '三';
            break;
        case 4:
            $week_pre_name = '四';
            break;
        case 5:
            $week_pre_name = '五';
            break;
        case 6:
            $week_pre_name = '六';
            break;
        case 7:
            $week_pre_name = '日';
            break;
        default:
            $week_pre_name = '';
    }

    $test = '';
    if($time>=$now_time){
        //未来
        $test = '';
    }elseif($time>$today_time){
        //今天
        $diff_time = $now_time-$time;
        if($diff_time<60){
            $test = $diff_time.'秒前';
        }elseif($diff_time<3600){
            $test = intval($diff_time/60).'分钟前';
        }else{
            $test = intval($diff_time/3600).'小时前';
        }
    }elseif($time>$yesterday_time){
        //昨天
        $test = '昨天 '.$pre_name.' '.date('H:i',$time);
    }elseif($time>$now_week_time){
        //这周内
        $test = '周'.$week_pre_name.' '.$pre_name.' '.date('H:i',$time);
    }elseif($time>$now_year_time){
        //今年
        $test = date('m月d日',$time).' '.$pre_name.' '.date('H:i',$time);
    }else{
        //更早
        $test = date('Y月m月d日',$time).' '.$pre_name.' '.date('H:i',$time);
    }
    return $test;
}

$time = time()-2;
for($i=0;$i<30;$i++){
    echo timespan($time);
    echo '<br>';
    $time = $time-3600*6;
}

//########################上面是用函数实现的
//########################下面是用对象实现的

define('NOW_TIME',time());
define('TODAY_TIME',strtotime(date('Y-m-d',NOW_TIME)));
define('YESTERDAY_TIME',TODAY_TIME-86400);
$now_week = date('w',NOW_TIME);
$now_week==0 && $now_week=7;
define('NOW_WEEK_TIME',TODAY_TIME-($now_week-1)*86400);
define('NOW_YEAR_TIME',strtotime(date('Y-01-01')));

class timespan{
    public $time; //要计算的时间的时间戳
    const now_time=NOW_TIME;
    const today_time=TODAY_TIME;
    const yesterday_time = YESTERDAY_TIME;
    const now_week_time = NOW_WEEK_TIME;
    const now_year_time = NOW_YEAR_TIME;
    function __construct($time=null)
    {
        !empty($time) && $this->time = $time;
        $this->time = $time;
    }

    /**
     * 返回 上午,下午,晚上,凌晨
     * @param null $time
     * @return string
     */
    function get_pre_name($time=null){
        !empty($time) && $this->time = $time;
        $the_day_time = strtotime(date('Y-m-d',$this->time));
        $one_day_second = $this->time-$the_day_time;
        if($one_day_second<3600*6){
            $pre_name = '凌晨';
        }elseif($one_day_second<3600*12){
            $pre_name = '上午';
        }elseif($one_day_second<3600*18){
            $pre_name = '下午';
        }else{
            $pre_name = '晚上';
        }
        return $pre_name;
    }

    function get_week_name($time=null){
        !empty($time) && $this->time = $time;
        $the_week = date('w',$this->time);
        $the_week==0 && $the_week=7;
        $week_pre_name = '';
        switch ($the_week){
            case 1:
                $week_pre_name = '一';
                break;
            case 2:
                $week_pre_name = '二';
                break;
            case 3:
                $week_pre_name = '三';
                break;
            case 4:
                $week_pre_name = '四';
                break;
            case 5:
                $week_pre_name = '五';
                break;
            case 6:
                $week_pre_name = '六';
                break;
            case 7:
                $week_pre_name = '日';
                break;
            default:
                $week_pre_name = '';
        }
        return $week_pre_name;
    }
    function formate($time = null){
        !empty($time) && $this->time = $time;
        $test = '';
        if($this->time>=self::now_time){
            //未来
            $test = '';
        }elseif($this->time>self::today_time){
            //今天
            $diff_time = self::now_time-$this->time;
            if($diff_time<60){
                $test = $diff_time.'秒前';
            }elseif($diff_time<3600){
                $test = intval($diff_time/60).'分钟前';
            }else{
                $test = intval($diff_time/3600).'小时前';
            }
        }elseif($this->time>self::yesterday_time){
            //昨天
            $pre_name = $this->get_pre_name();
            $test = '昨天 '.$pre_name.' '.date('H:i',$this->time);
        }elseif($this->time>self::now_week_time){
            //这周内
            $pre_name = $this->get_pre_name();
            $week_pre_name = $this->get_week_name();
            $test = '周'.$week_pre_name.' '.$pre_name.' '.date('H:i',$this->time);
        }elseif($this->time>self::now_year_time){
            //今年
            $pre_name = $this->get_pre_name();
            $test = date('m月d日',$this->time).' '.$pre_name.' '.date('H:i',$this->time);
        }else{
            //更早
            $pre_name = $this->get_pre_name();
            $test = date('Y月m月d日',$this->time).' '.$pre_name.' '.date('H:i',$this->time);
        }
        return $test;
    }
}
//调用方法
$obj = new timespan();
for($i=0;$i<30;$i++){
    echo $obj->formate($time);
    echo '<br>';
    $time = $time-3600*6;
}

 对于技术来说,写这个东西,真没技术含量,只所以贴出了,是想表明我想做产品的态度

posted @ 2016-07-22 13:07  兔六哥  阅读(1107)  评论(0编辑  收藏  举报