Рассчитайте, какая дата будет основана на дате начала и значении, используя выходные дни PHP.

У меня есть начальная дата, допустим, это $startDate = 2012-08-01;, и у меня есть переменная, которая хранит значение INT, скажем, это $value = 10;

Я хотел бы рассчитать дату начала + 10 дней и пропустить выходные.

Используя приведенные выше значения, результат будет 2012-08-15

Как это сделать?


person David    schedule 14.08.2012    source источник


Ответы (4)


Это далеко не эффективно, но кого это волнует, когда это читабельно? :)

<?php
function calculateNextDate($startDate, $days)
{
        $dateTime = new DateTime($startDate);

        while($days) {
            $dateTime->add(new DateInterval('P1D'));    

            if ($dateTime->format('N') < 6) {
                $days--;
            }
        }

        return $dateTime->format('Y-m-d');
}

echo calculateNextDate('2012-08-01', 10); // return 2012-08-15

ДЕМО

То, что происходит, должно быть довольно легко проследить. Сначала мы создаем новый объект DateTime, используя дату, предоставленную пользователем. После этого мы перебираем дни, которые хотим добавить к дате. Когда мы выпадаем на выходные, мы не вычитаем день из дней, которые хотим добавить к дате.

person PeeHaa    schedule 14.08.2012
comment
Работа идеальна, спасибо! Также большое спасибо за объяснение - person David; 14.08.2012

вы можете использовать функцию php strtotime + n дней/часов и т. д.,

а для исключения выходных посмотрите здесь: 32 часа назад, исключая выходные с php

person alpera    schedule 14.08.2012

Попробуй это

<?php
function businessdays($begin, $end) {
    $rbegin = is_string($begin) ? strtotime(strval($begin)) : $begin;
    $rend = is_string($end) ? strtotime(strval($end)) : $end;
    if ($rbegin < 0 || $rend < 0)
        return 0;

    $begin = workday($rbegin, TRUE);
    $end = workday($rend, FALSE);

    if ($end < $begin) {
        $end = $begin;
        $begin = $end;
    }

    $difftime = $end - $begin;
    $diffdays = floor($difftime / (24 * 60 * 60)) + 1;

    if ($diffdays < 7) {
        $abegin = getdate($rbegin);
        $aend = getdate($rend);
        if ($diffdays == 1 && ($astart['wday'] == 0 || $astart['wday'] == 6) && ($aend['wday'] == 0 || $aend['wday'] == 6))
            return 0;
        $abegin = getdate($begin);
        $aend = getdate($end);
        $weekends = ($aend['wday'] < $abegin['wday']) ? 1 : 0;
    } else
        $weekends = floor($diffdays / 7);
    return $diffdays - ($weekends * 2);
}

function workday($date, $begindate = TRUE) {
    $adate = getdate($date);
    $day = 24 * 60 * 60;
    if ($adate['wday'] == 0) // Sunday
        $date += $begindate ? $day : -($day * 2);
    return $date;
}

$def_date="";//define your date here
$addDay='5 days';//no of previous days  
date_add($date, date_interval_create_from_date_string($addDay));
echo businessdays($date, $def_date); //date prior to another date 
?>

Изменено с PHP.net

person pckabeer    schedule 14.08.2012

если вы просто хотите добавить дату +10, вы можете подумать об этом:

date("Г-м-д", strtotime("+10 дней"));

person test    schedule 14.08.2012
comment
Вопрос спрашивает, как пропустить даты выходных. Код, который у вас есть, просто добавит 10 дней. - person Fluffeh; 14.08.2012