PHP获取一年有多少周和每周开始和结束日期

/*PHP获取当前日期是第几周和本周开始日期和本周结束日期*/
//$now = '2018-11-13';周二
public function getNowTimeInfo($now)
{
    $str = array();
    //$first =1 表示每周星期一为开始日期 0表示每周日为开始日期
    $str['year'] = date('Y', strtotime($now));
    $first = 1;
    //当日在整年中的第几周
    $str['week'] = date('W', strtotime($now));
    //获取当前周的第几天 周日是 0 周一到周六是 1 - 6
    $w = date('w', strtotime($now));
    //获取本周开始日期,如果$w是0,则表示周日,减去 6 天
    $week_start = date('Y-m-d', strtotime("$now -" . ($w ? $w - $first : 6) . ' days'));
    $str['week_start'] = $week_start;
    //本周结束日期
    $week_end = date('Y-m-d', strtotime("$week_start +6 days"));
    $str['week_end'] = $week_end;
    return $str;
}

返回值:

Array
(
    [year] => 2018
    [week] => 46
    [week_start] => 2018-11-12//周一
    [week_end] => 2018-11-18//周日
)

    

---------------------------------------------------------------------------------------------------------------------------------------------

 

/**
 * 获取一年每周的开始日期和结束日期
 * @param $year
 * @return mixed
 */
public static function get_week($year)
{
    $year_start = $year . "-01-01";
    $year_end = $year . "-12-31";
    $startday = strtotime($year_start);
    if (intval(date('N', $startday)) != '1') {
        $startday = strtotime("next monday", strtotime($year_start)); //获取年第一周的日期
    }
    $year_mondy = date("Y-m-d", $startday); //获取年第一周的日期

    $endday = strtotime($year_end);
    if (intval(date('W', $endday)) == '7') {
        $endday = strtotime("last sunday", strtotime($year_end));
    }

    //$num = intval(date('W', $endday));可以获取当年以前的年份有多少周,如果是当年还没到12-31号$num为1
    $num = 52;//一年约52周
    for ($i = 1; $i <= $num; $i++) {
        $j = $i - 1;
        $start_date = date("Y-m-d", strtotime("$year_mondy $j week "));

        $end_day = date("Y-m-d", strtotime("$start_date +6 day"));

        $week_array[$i] = array(
            $start_date, $end_day);
    }
    return $week_array;
}

 

返回值:共52周

但上面这个获取一年每周的日期遇到头一年最后几天和今年的开始几天是第一周时就不好用了(如2019年第一周是2018-12-31至2019-01-06)而我这个上面的第一周是从2019-01-07至2019-01-13

---------------------------------------------------------------------------------------------------------------------------------------------

如果遇到上面的情况要求周数严谨,可以用下面的:(更新日期第一版2018-11-14)(更新日期第二版2019年7月18日)完善demo

<?php

class Week
{
    function get_week_all($year)
    {
        $whole_week = $this->get_big_week($year);//获取最大周数
        $str = '';
        for ($i = 1; $i <= $whole_week; $i++) {
            $str .= $i . ',';
        }
        $str_arr = explode(',', rtrim($str, ','));//转成数组
        $week_list = array();
        foreach ($str_arr as $key => $value) {
            $week_list[$key]['num'] = $value;
            $week = $this->get_year_month_week($year, $value);//一周的日期
            $week_list[$key]['detail'] = "第" . $value . "周(" . $week[0] . "至" . $week[6] . ")";
        }
        return $week_list;
    }

    /*
    用法:
    $this->get_date("Y-m-d","+1 day");当前日期加一天
    $this->get_date("Y-m-d","+1 month",$date);指定日期下一月
    $this->get_date("Y-m","+1 years",$date);指定日期下一年的年月
    $this->get_date("Y-m-t",NULL,$date);指定日期的月底
    $this->get_date("m","+1 month",$date);指定日期下一个月的月份(获取月份时候,日期必填。不然个别日期会有bug存在)
    等等,根据需求自己获取。代码里面strtotime获取日期的地方都会变成公共方法调用。
    */
    function get_date($return, $string, $date)
    {
        if (empty($return)) {
            $return = "Y-m-d";
        }
        if (empty($string)) {
            $string = "now";
        }
        if (empty($date)) {
            $date = time();
        } else {
            $date = strtotime(date($date));
        }
        if (preg_match("/month/", $string)) {
            $first_day_of_month = date('Y-m', $date) . '-01';
            $str_date = strtotime($first_day_of_month);
        }
        if (preg_match("/month/", $string)) {
            $l_date = date("Y-m-d", strtotime($string, $str_date));
            $day = substr(date("Y-m-d", $date), 8, 2);
            if (substr($l_date, 0, 7) . '-' . date('t', strtotime(substr($l_date, 0, 7))) < substr($l_date, 0, 7) . '-' . $day) {
                $l_date = substr($l_date, 0, 7) . '-' . date('t', strtotime(substr($l_date, 0, 7)));
            } else {
                $l_date = substr($l_date, 0, 7) . '-' . $day;
            }
            $l_date = date($return, strtotime($l_date));
            return $l_date;
        } else {
            return date($return, strtotime($string, $date));
        }
    }

    function get_big_week($year_now)
    {
        $big_week = $this->get_date("W", NULL, $year_now . '-12-31');
        if ($big_week == 1) {
            $big_week = $this->get_date("W", NULL, $year_now . '-12-30');
        }
        if ($big_week == 1) {
            $big_week = $this->get_date("W", NULL, $year_now . '-12-29');
        }
        if ($big_week == 1) {
            $big_week = $this->get_date("W", NULL, $year_now . '-12-28');
        }
        if ($big_week == 1) {
            $big_week = $this->get_date("W", NULL, $year_now . '-12-27');
        }
        if ($big_week == 1) {
            $big_week = $this->get_date("W", NULL, $year_now . '-12-26');
        }
        if ($big_week == 1) {
            $big_week = $this->get_date("W", NULL, $year_now . '-12-25');
        }
        if ($big_week == 1) {
            $big_week = $this->get_date("W", NULL, $year_now . '-12-24');
        }
        return $big_week;
    }

    function get_year_month_week($year_now, $week_now)
    {
        //指定年和周的日期数组
        $time = new \DateTime();
        $time->setISODate($year_now, $week_now, 1);
        $result[] = $time->format('Y-m-d');
        $time->setISODate($year_now, $week_now, 2);
        $result[] = $time->format('Y-m-d');
        $time->setISODate($year_now, $week_now, 3);
        $result[] = $time->format('Y-m-d');
        $time->setISODate($year_now, $week_now, 4);
        $result[] = $time->format('Y-m-d');
        $time->setISODate($year_now, $week_now, 5);
        $result[] = $time->format('Y-m-d');
        $time->setISODate($year_now, $week_now, 6);
        $result[] = $time->format('Y-m-d');
        $time->setISODate($year_now, $week_now, 7);
        $result[] = $time->format('Y-m-d');
        return $result;
    }


}

$Week = new Week();
print_r($Week->get_week_all('2019'));

 

得到结果:

//PHP计算两个日期的差值
$sdate = new DateTime("1949-10-01");
$edate = new DateTime();
$interval = $sdate->diff($edate);
echo "差值 : " . $interval->y . " 年, " . $interval->m." 月, ".$interval->d." 天 ";

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锅巴胸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值