【问题标题】:Distribute a month in weeks with start and end dates array使用开始和结束日期数组以周为单位分配一个月
【发布时间】:2014-09-02 15:10:02
【问题描述】:

我正在制作一个函数,它将当前月份分成几周的数组,每周都有其开始和结束日期。例如,当前月份是 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';

我知道只有非闰二月才有 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'

如何解决这个问题?

感谢您的回答。

【问题讨论】:

    标签: php date time


    【解决方案1】:

    如果结束日期大于当月的天数,您可以在 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
        )
    

    【讨论】:

    • 是的。我正要评论说这里可能需要else。让我用像二月这样的硬编码月份和其他一些 31 天的月份来测试代码,但看起来这个函数可以正常工作。谢谢你:)
    【解决方案2】:

    另一种选择是也为此使用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
            )
    
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      相关资源
      最近更新 更多