php根据开始和结束时间,计算之间的周次

计算两个时间段之间有多少周,并列出每周的第一天和最后一天时间

2019-08-05——2020-01-12周次
image.png
<?php
    header("content-type:text/html;charset=utf-8");  //设置编码
    error_reporting(0); //关闭错误报告
    /*
     * 根据起始和结束时间,计算之间有多少周
     * 以起始时间开始,七天为一周,与日期是星期几无关
     * $start_time 起始时间 2019-09-01
     * $end_time   结束时间 2020-01-18
     *
     */

    function week($start_time,$end_time){
        //开始的时间戳值
        $start = strtotime($start_time);
        //结束的时间戳值
        $end  = strtotime($end_time.' 23:59:59') + 1 ;

        //两者之间有多少天
        //这个算法是不准确的,如 2019-09-01——2019-10-26之间是56天,而2019-09-01——2019-10-27之间是:57.041666666667
        $total_day = ($end - $start)/(24*3600);

        //两者中间有多少周
        $total_week = ceil($total_day/7);

        $data = [];
        //知道有多少周后,根据起始时间和当前周次,反推每周起始结束时间
        for( $i=1;$i<=$total_week;$i++ ){
            $week_name = '第'.$i.'周:';
            //每周的开始时间:起始时间加上七天时间
            $last_time = (7*($i-1))*(24*3600) + $start;

            //第一周特别判断
            if( $i == 1 ){
                $first_day = date("Y-m-d",$start);          //第一周的第一天用起始时间
                $last_day = date("Y-m-d",$start+6*24*3600); //第一周的最后一天,是再第一周的时间上加6天

            }elseif( $i == $total_week ){
                //最后一周特别判断
                $first_day = date("Y-m-d",$last_time);      //最后一周的第一天
                /*$next = strtotime($first_day);
                if( $next > strtotime($end_time) ){
                    //如果最后一周的第一天比结束时间还大,就用结束时间作为第一天的时间
                    $first_day = date("Y-m-d",strtotime($end_time));
                }*/
                $last_day = date("Y-m-d",strtotime($end_time));
            }else{
                //中间周
                $first_day = date("Y-m-d",$last_time);
                $last_day = date("Y-m-d",$last_time+6*24*3600); //每周的结束时间:每周开始时间加6天
            }

            $time_name = $first_day.'——'.$last_day;
            $data[$i] = $week_name.$time_name;

        }
        return $data;
    }

    //方法测试
    $start_time = '2019-08-05';     //起始时间
    $end_time = '2020-01-12';       //结束时间
    $test = week($start_time,$end_time);

    echo "<pre>";
    print_r($test);
    exit;


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容