/**
* 跨月周
*/
public function trans_month_week($year = 0,$month = 0){
$data['year'] = $year ? $year : date('Y'); //年
$data['month'] = $month ? $month : date('n'); //月
$data['days'] = date('t',strtotime($data['year'].'-'.$data['month'])); //本月的最后一天是几号
$data['week_num'] = 4; //本月有几周
$first_day = date('N',strtotime($data['year'].'-'.$data['month'].'-1')); //获取本月的第一天是周几
$data['month_start'] = $first_day == 1 ? strtotime($data['year'].'-'.$data['month'].'-'.$first_day)
: strtotime($data['year'].'-'.$data['month'].'-'.(1+(8-$first_day))); //月开始时间(本月第一个周一的日期)
$last_day = date('N',strtotime($data['year'].'-'.$data['month'].'-'.$data['days'])); //获取本月的最后一天是周几
//如果本月最后一天在周一到周三,并且本月的第一天在周六到周日或者等于周一,则本月有五周
$last_day < 4 && ($first_day > 5 || $first_day == 1) && $data['week_num'] = 5;
$year = $data['year'];
$month = $data['month'];
$days = $data['days'];
//如果最后一天不是周日
if ($last_day != 7){
$month++; //占用下个月
//如果超过12个月
if ($month > 12){
$year++;
$month = 1;
}
$days = 7 - $last_day; //占用到下个月的几号
}
$data['month_end'] = strtotime($year.'-'.$month.'-'.$days) + 86399; //月结束时间(本月最后一个周一的周日)
//本月每周的起始时间
for ($i=1;$i<=$data['week_num'];$i++){
$count = 7*$i; //一周7天
$num = $first_day == 1 ? $count : 8-$first_day+$count; //本周一到下周一(8天)减去本月的第一天的星期(周二等于2)加上一周的天数等于本月第一个周一到周日的周日天数(8-2+7=13)
$data['week_start_'.$i] = strtotime($data['year'].'-'.$data['month'].'-'.($num-6)); //周日的时间减去6天得到周一的时间
$data['week_end_'.$i] = strtotime($data['year'].'-'.$data['month'].'-'.$num) + 86399; //本周日的时间
//如果得到的天数大于本月的最后一天,则等于月结束时间
$num > $data['days'] && $data['week_end_'.$i] = $data['month_end'];
}
return $data;
}
/**
* 当前是本月的第几周
*/
public function week_now(){
$time_now = time(); //当前时间
$trans_month_week = $this->trans_month_week(); //跨月周
$trans_month_week['week_now'] = 0; //本月的第几周
for ($i=1;$i<=$trans_month_week['week_num'];$i++){
//当前时间大于等于周开始时间,小于等于结束时间
if ($time_now >= $trans_month_week['week_start_'.$i] && $time_now <= $trans_month_week['week_end_'.$i]){
$trans_month_week['week_now'] = $i; //获得本月的当前周
}
}
//如果不满足以上条件,则代表跨月
if ($trans_month_week['week_now'] == 0){
$year = date('Y'); //当前年
$month = date('n')-1; //上个月
//如果等于0,则代表去年12月
if ($month == 0){
$year--;
$month = 12;
}
$trans_month_week = $this->trans_month_week($year,$month); //跨月周
$trans_month_week['week_now'] = 0; //本月的第几周
for ($i=1;$i<=$trans_month_week['week_num'];$i++){
//当前时间大于等于周开始时间,小于等于结束时间
if ($time_now >= $trans_month_week['week_start_'.$i] && $time_now <= $trans_month_week['week_end_'.$i]){
$trans_month_week['week_now'] = $i; //获得本月的当前周
}
}
}
return $trans_month_week;
}
//返回
array:16 [▼
“year” => “2021”
“month” => “3”
“days” => “31”
“week_num” => 5
“month_start” => 1614528000 //2021-03-01 00:00:00
“month_end” => 1617551999 //2021-04-04 23:59:59
“week_start_1” => 1614528000 //2021-03-01 00:00:00
“week_end_1” => 1615132799 //2021-03-07 23:59:59
“week_start_2” => 1615132800 //2021-03-08 00:00:00
“week_end_2” => 1615737599 //2021-03-14 23:59:59
“week_start_3” => 1615737600 //2021-03-15 00:00:00
“week_end_3” => 1616342399 //2021-03-21 23:59:59
“week_start_4” => 1616342400 //2021-03-22 00:00:00
“week_end_4” => 1616947199 //2021-03-28 23:59:59
“week_start_5” => 1616947200 //2021-03-29 00:00:00
“week_end_5” => 1617551999 //2021-04-04 23:59:59
“week_now” => 3 //当月的第三周
]