按开始日期和结束日期分配一个月,每周数组
问题描述:
我正在制作一个函数,将当前月份分成几周,每周以其开始和结束日期。例如,当前月份是九月,所以这是我希望我的函数返回:按开始日期和结束日期分配一个月,每周数组
$week_arr[1]['start'] = '1-09-2014';
$week_arr[1]['end'] = '7-09-2014';
$week_arr[2]['start'] = '8-09-2014';
$week_arr[2]['end'] = '14-09-2014';
/*
.
.
.
*/
$week_arr[5]['start'] = '29-09-2014';
$week_arr[5]['end'] = '30-09-2014';
我明白,只有非闰年的二月将有4周。 这是我迄今为止
$no_of_days_in_month = date("t");
$no_of_weeks = (ceil(intval($no_of_days_in_month)/7));
$week_inc = 0;
$curr_month_year = date("m-Y");
$week_arr = array();
for($i = 1; $i <= $no_of_weeks; $i++){
$week_arr[$i]['start'] = ($week_inc+1)."-".$curr_month_year;
$week_arr[$i]['end'] = ($week_inc+7)."-".$curr_month_year;
$week_inc += 7;
}
var_dump($week_arr);
它的工作原理几乎正常,但我希望它停止在每月的最后一周的最后一天。 以上代码与本周的5th
索引有问题。它的结果
$week_arr[5]['start'] = '29-09-2014'
$week_arr[5]['end'] = '35-09-2014'
如何解决这个问题?
谢谢你的回答。
答
你可以添加一个检查,你for
循环的开始,如果结束日期比天的月份数时停止处理:
if($week_inc + 7 > $no_of_days_in_month)
break;
或者,如果你还在要部分星期结束时,你可以使用类似的检查,以确定最后一天应该是什么:
for($i = 1; $i <= $no_of_weeks; $i++){
if($week_inc + 7 > $no_of_days_in_month)
$day = $no_of_days_in_month;
else
$day = $week_inc + 7;
$week_arr[$i]['start'] = ($week_inc+1)."-".$curr_month_year;
$week_arr[$i]['end'] = $day."-".$curr_month_year;
$week_inc += 7;
}
You'll then get在最后一个完整的星期:
[5] => Array
(
[start] => 29-09-2014
[end] => 30-09-2014
)
答
另一种选择是使用DatePeriod
类这一个了。例如:
$begin = new DateTime('first day of ' . date('Y-m-d'));
$end = new DateTime('last day of ' . date('Y-m-d'));
$interval = new DateInterval('P1W');
$daterange = new DatePeriod($begin, $interval, $end);
$dates = array();
foreach($daterange as $key => $date) {
$check = ($date->format('W') != $end->modify('last day of this month')->format('W')) ? '+6 days' : 'last day of this week';
$dates[$key+1] = array(
'start' => $date->format('Y-m-d'),
'end' => $date->modify($check)->format('Y-m-d'),
);
}
echo '<pre>';
print_r($dates);
应该产生这样的:
Array
(
[1] => Array
(
[start] => 2014-09-01
[end] => 2014-09-07
)
[2] => Array
(
[start] => 2014-09-08
[end] => 2014-09-14
)
[3] => Array
(
[start] => 2014-09-15
[end] => 2014-09-21
)
[4] => Array
(
[start] => 2014-09-22
[end] => 2014-09-28
)
[5] => Array
(
[start] => 2014-09-29
[end] => 2014-09-30
)
)
是。我正要评论说这里可能需要'else'。让我测试一下硬编码月份的代码,比如2月份和其他月份的31天,但看起来这个函数可以正常工作。谢谢 :) – 2014-09-02 04:49:15