PHP获取昨天、今天、本周、上周、本月、上月

转载自剑花烟雨江南

在开发中,我们往往需要对数据进行统计,而统计离不开时间维度的搜索,因此我们可以建立一个公共的时间类库来生成相关的时间范围。

<?php
class StatisticsDate
{
    //环比对应的时间戳
    const CHAIN_RATIO = [
        'today' => 'yesterday',
        'week' => 'lastWeek',
        'month' => 'lastMonth'
    ];
    //单例模式
    protected static $instance;
    //返回的时间格式
    private $timestamp;
    //单例方法
    public static function getInstance()
    {
        if (!self::$instance instanceof StatisticsDate) {
            self::$instance = new static();
        }
        return self::$instance;
    }

    //设置时间格式 默认为时间戳, 可传入 date 方法的 时间参数
    public function setTimestamp($timestamp)
    {
        $this->timestamp = $timestamp;
        return $this;
    }

    /**
     * 传入时间格式 并返回开始时间和结束时间
     * @param $dateType
     * @return array
     */
    public final function execute($dateType)
    {
        switch ($dateType)
        {
            case 'today':
                $range = $this->getDateRangeByToday();
                break;
            case 'yesterday':
                $range = $this->getDateRangeByYesterday();
                break;
            case 'week':
                $range = $this->getDateRangeByWeek();
                break;
            case 'lastWeek':
                $range = $this->getDateRangeByLastWeek();
                break;
            case 'month':
                $range = $this->getDateRangeByMonth();
                break;
            case 'lastMonth':
                $range = $this->getDateRangeByLastMonth();
                break;
            default:
                $range = [];
        }

        return $range;
    }

    /**
     * 环比时可以用
     * @param $dateType
     * @return array
     */
    public function chainRatioExecute($dateType)
    {
        if(!isset(self::CHAIN_RATIO[$dateType]))
        {
            return [];
        }
        return $this->execute(self::CHAIN_RATIO[$dateType]);
    }

    /**
     * 返回今天的时间范围
     * @return array
     */
    protected function getDateRangeByToday()
    {
        return [
            $this->getTime(mktime(0, 0, 0, date('m'), date('d'), date('Y'))),
            $this->getTime(mktime(23, 59, 59, date('m'), date('d'), date('Y')))
        ];
    }

    /**
     * 返回昨日的时间范围
     * @return array
     */
    protected function getDateRangeByYesterday()
    {
        $yesterday = date('d') - 1;
        return [
            $this->getTime(mktime(0, 0, 0, date('m'), $yesterday, date('Y'))),
            $this->getTime(mktime(23, 59, 59, date('m'), $yesterday, date('Y')))
        ];

    }

    /**
     * 获取本周的时间范围
     * @return array
     */
    protected function getDateRangeByWeek()
    {
        $timestamp = time();
        return [
            $this->getTime(strtotime(date('Y-m-d', strtotime("this week Monday", $timestamp)))),
            $this->getTime(strtotime(date('Y-m-d', strtotime("this week Sunday", $timestamp))) + 24 * 3600 - 1)
        ];
    }

    /**
     * 获取上周的时间范围
     * @return array
     */
    protected function getDateRangeByLastWeek()
    {
        $timestamp = time();
        return [
            $this->getTime(strtotime(date('Y-m-d', strtotime("last week Monday", $timestamp)))),
            $this->getTime(strtotime(date('Y-m-d', strtotime("last week Sunday", $timestamp))) + 24 * 3600 - 1)
        ];
    }

    /**
     * 获取本月的时间范围
     * @return array
     */
    protected function getDateRangeByMonth()
    {
        return [
            $this->getTime(mktime(0, 0, 0, date('m'), 1, date('Y'))),
            $this->getTime(mktime(23, 59, 59, date('m'), date('t'), date('Y')))
        ];
    }

    /**
     * 获取上月的时间范围
     * @return array
     */
    protected function getDateRangeByLastMonth()
    {
        $begin = mktime(0, 0, 0, date('m') - 1, 1, date('Y'));
        $end = mktime(23, 59, 59, date('m') - 1, date('t', $begin), date('Y'));

        return [$this->getTime($begin), $this->getTime($end)];
    }

    /**
     * 按 $this->timestamp 返回时间格式
     * @param string $time
     * @return false|int|string
     */
    public function getTime($time = '')
    {
        switch (true) {
            case (empty($time)):
                $timeInt = time();
                break;
            case (is_numeric($time)):
                $timeInt = $time;
                break;
            case (is_string($time)):
                $timeInt = strtotime($time);
                if (false == $timeInt) {
                    $timeInt = time();
                }
                break;
            default:
                $timeInt = time();
        }
        return empty($this->timestamp) ? $timeInt : date($this->timestamp, (int)$timeInt);
    }

    /**
     * 获取给定的开始时间和结束时间的每天时间
     * @param int $start
     * @param int $end
     * @return array|bool
     */
    public function getTimeRangeByDateRange(int $start, int $end)
    {
        if($start > $end)
        {
            return false;
        }
        $diff = ($end - $start)/86400;
        $day = [];
        for ($i = 0; $i <= $diff; $i ++)
        {
            $day[] = $this->getTime($start + $i* 24 * 60 * 60);
        }
        return $day;
    }
}

评论

(= ̄ω ̄=)··· 暂无内容!

回复

您还未登录,请先登录或者注册