使用开始日期和结束日期数组分配一个月的周数

时间:2014-09-02 04:40:57

标签: php date time

我正在创建一个函数,将当前月份分成几周,每周都有其开始和结束日期。例如,当前月份是9月,所以这是我期望我的函数返回的:

$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';

据我所知,只有非飞跃2月将有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'

如何解决这个问题?

感谢您的回答。

2 个答案:

答案 0 :(得分:4)

如果结束日期大于当月的天数,您可以在for循环的开头添加一项检查以停止处理:

if($week_inc + 7 > $no_of_days_in_month)
    break;

Output

或者,如果您仍希望结束部分周,则可以使用类似的检查来定义最后一天应该是什么:

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
    )

答案 1 :(得分:1)

另一种选择是对这一个使用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
        )

)