【问题标题】:Skip the week range from months range in PHP跳过 PHP 中月份范围的周范围
【发布时间】:2020-04-15 11:40:46
【问题描述】:

我只想从日期范围(月份范围)中跳过给定的一周。 例如,我的日期范围在 2020-04-01 到 2020-04-30 之间。我只需要跳过这个日期范围的隔周,即 2020-04-08 到 2020-04-14 和 2020-04-22 到 2020-04-28。所以我的最终输出将是

    [0] => 2020-04-01
    [1] => 2020-04-02
    [2] => 2020-04-03
    [3] => 2020-04-04
    [4] => 2020-04-05
    [5] => 2020-04-06
    [6] => 2020-04-07
    [7] => 2020-04-15
    [8] => 2020-04-16
    [9] => 2020-04-17
    [10] => 2020-04-18
    [11] => 2020-04-19
    [12] => 2020-04-20
    [13] => 2020-04-21
    [14] => 2020-04-29
    [15] => 2020-04-30

这些跳过应该是动态的,比如每隔一周跳过一次,第三周等等...... 我希望你明白我想说什么

【问题讨论】:

    标签: php loops for-loop


    【解决方案1】:

    可能是这样的:

    您只需要传入第一个月的日期和要排除的周数。

    function excludeWeeks($dateStart, $excludeWeeks) {
    $finalDates = [];
    $date = new DateTime($dateStart);    
    
    $daysInMonth = date("t", strtotime($dateStart));;    
    
    
    $firstOfMonth = strtotime(date("Y-m-01", strtotime($date->format('Y-m-d'))));
        $modifiedDate = $date->format('Y-m-d');
        for ($i = 0; $i <= $daysInMonth; $i++) {
            if($i > 0) {
              $modifiedDate = $date->modify('+ 1 day')->format('Y-m-d');   
            }
        $weekNumber =  intval(date("W", strtotime($modifiedDate))) - intval(date("W", $firstOfMonth)) + 1;
    
        if(!in_array($weekNumber, $excludeWeeks)) {
            $finalDates[] = $modifiedDate;
        }
        }
        print_r($finalDates);
    }
    
    excludeWeeks('2020-04-1', ["3"]); 
    

    将打印我们的:

    Array ( [0] => 2020-04-01 [1] => 2020-04-02 [2] => 2020-04-03 [3] => 2020-04-04 [4] => 2020-04-05 [5] => 2020-04-06 [6] => 2020-04-07 [7] => 2020-04-08 [8] => 2020-04-09 [9] => 2020-04-10 [10] => 2020-04-11 [11] => 2020-04-12 [12] => 2020-04-20 [13] => 2020-04-21 [14] => 2020-04-22 [15] => 2020-04-23 [16] => 2020-04-24 [17] => 2020-04-25 [18] => 2020-04-26 [19] => 2020-04-27 [20] => 2020-04-28 [21] => 2020-04-29 [22] => 2020-04-30 [23] => 2020-05-01 )
    

    根据您的评论,您可以这样做:

    function excludeWeeks($dateStart, $dateEnd, $excludeWeeks) {
            $totalDays = strtotime($dateEnd) - strtotime($dateStart); 
            $totalDays = round($totalDays / (60 * 60 * 24));
            $finalDates = [];
            $dateStart = new DateTime($dateStart);      
    
            $modifiedDate = $dateStart->format('Y-m-d');
            for ($i = 0; $i < $totalDays; $i++) {
                if($i > 0) {
                  $modifiedDate = $dateStart->modify('+ 1 day')->format('Y-m-d');  
                }
    
               $weekNumber = (int)$i/7 + 1;
    
            if(!in_array( (int)$weekNumber, $excludeWeeks)) {
                $finalDates[] = $modifiedDate;
             }
            }
             print("<pre>".print_r($finalDates,true)."</pre>");
        }
    
        excludeWeeks('2020-04-1','2020-06-18', ["2","4","6","8","10"]);
    

    这将排除所有周(不是根据日历,而是如您所说,7 天)并打印如下内容:

        Array
    (
        [0] => 2020-04-01
        [1] => 2020-04-02
        [2] => 2020-04-03
        [3] => 2020-04-04
        [4] => 2020-04-05
        [5] => 2020-04-06
        [6] => 2020-04-07
        [7] => 2020-04-15
        [8] => 2020-04-16
        [9] => 2020-04-17
        [10] => 2020-04-18
        [11] => 2020-04-19
        [12] => 2020-04-20
        [13] => 2020-04-21
        [14] => 2020-04-29
        [15] => 2020-04-30
        [16] => 2020-05-01
        [17] => 2020-05-02
        [18] => 2020-05-03
        [19] => 2020-05-04
        [20] => 2020-05-05
        [21] => 2020-05-13
        [22] => 2020-05-14
        [23] => 2020-05-15
        [24] => 2020-05-16
        [25] => 2020-05-17
        [26] => 2020-05-18
        [27] => 2020-05-19
        [28] => 2020-05-27
        [29] => 2020-05-28
        [30] => 2020-05-29
        [31] => 2020-05-30
        [32] => 2020-05-31
        [33] => 2020-06-01
        [34] => 2020-06-02
        [35] => 2020-06-10
        [36] => 2020-06-11
        [37] => 2020-06-12
        [38] => 2020-06-13
        [39] => 2020-06-14
        [40] => 2020-06-15
        [41] => 2020-06-16
        [42] => 2020-06-17
    )
    

    您可以使用任何 startTime 和 endTime。

    【讨论】:

    • 不@JureW我不是那个意思..我必须跳过第2周、第4周、第6周、第8周等等,但我的日期范围可能从任何日期开始并从那个日期开始我们必须根据日历计算 7 天 1 周 ...
    • 好吧,误会了。看看我是否可以修改我的代码。
    • 请立即查看。应该适合您的需求。
    • 它的工作很棒我除了我已经根据我的需要修改了这个......
    【解决方案2】:

    起始参数在代码开头

    $startData = "2020-04-01";
    $endData = "2020-04-30";
    $skipData = "2020-04-08"; // skip one week starting from this data
    $everyNumberWeeks = 1;
    
    $dateTimestampStartData = strtotime($startData);
    $dateTimestampEndData = strtotime($endData);
    $dataTimestampSkipData = strtotime($skipData);
    $data = $startData;
    $dateTimestampData = strtotime($data);
    $skiping = 0;$show=true;
    while ($dateTimestampData <= $dateTimestampEndData)
    {
        $data = date("Y-m-d", $dateTimestampData);
        $dateTimestampData = strtotime($data) + 60*60*24;
        if ($dateTimestampData > $dataTimestampSkipData)
        {
            if (($skiping % (7*$everyNumberWeeks))==0)
            {
                $show = ! $show;
                $skiping = 0;
            }
            $skiping++;
        }
        if ($show)  echo "$data<BR>";
    }
    

    【讨论】:

    • 如果我没有更改结束日期看起来不错如果我正在更改结束日期,它不会按预期工作
    • 我认为你有一个实现你的解决方案的起点
    • 不,我有一个动态日期和动态跳过周日期范围可能从任何日期开始,从该日期开始,我们必须根据日历计算 1 周的 7 天......
    • 这些跳过是动态的,例如每隔一周跳过 ($everyNumberWeeks = 2)、第三周 ($everyNumberWeeks = 3) 等等
    • 如果每周 ($everyNumberWeeks = 1) 结果与您在原始帖子中提到的完全一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    相关资源
    最近更新 更多