Пропустите диапазон недели из диапазона месяцев в PHP - PullRequest
0 голосов
/ 15 апреля 2020

Я просто хочу пропустить заданную неделю из диапазона дат (диапазон месяцев). Например, у меня есть диапазон дат от 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

Эти пропуски должны быть динамическими c, как пропуск каждую вторую неделю, третью неделю и так далее ... Я надеюсь, вы понимаете, что я хочу сказать

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Может быть что-то вроде этого:

Вам нужно только указать дату для первого месяца и массив недель, чтобы исключить.

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 )

На основании вашего комментария вы можете сделать следующее:

<code>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)."
");} 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.

0 голосов
/ 15 апреля 2020

Начальные параметры в начале кода

$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>";
}
...