Как я могу определить количество дней недели в месяце? - PullRequest
4 голосов
/ 11 февраля 2011

У меня сейчас есть эта проблема: учитывая месяц и год, мне нужно знать, сколько у него дней недели (то есть, количество дней, исключая субботу и воскресенье).

Это кажется таким простым, и все же я сбит с толку.Конечно, я мог бы решить это с помощью цикла for и проверить, является ли день субботой или воскресным, и если нет, увеличить счетчик, но это просто глупо (и линейно), учитывая, что я почти уверен, что смогу получитьпокончим с парой делений или по модулю.

Есть идеи алгоритма?В вашем распоряжении все возможности PHP 4.4.1.


EDIT Вот рабочая реализация цикла for:

function weekdays_in_month($month, $year)
{
    $days_in_month = days_in_month($month); // days_in_month defined somewhere
    $first_day = date('w', mktime(0,0,0, $month, 1, $year));
    $counter = 0;
    for ($i = 0; $i < $days_in_month; $i++)
    {
        if (($first_day + $i + 1) % 7 >= 2)
            $counter++;
    }
    return $counter;
}

Ответы [ 3 ]

3 голосов
/ 11 февраля 2011

Просто проверьте рабочие дни 29-го, 30-го и 31-го числа (если эти даты существуют).

Добавить 20.

Редактирование вашей функции:

function weekdays_in_month($month, $year)
{
    // NOTE: days_in_month needs $year as input also, to account for leap years
    $days_in_month = days_in_month($month, $year); // days_in_month defined somewhere
    $first_day = date('w', mktime(0,0,0, $month, 1, $year));
    $counter = 20;  // first 28 days of month always have 20 weekdays
    for ($i = 28; $i < $days_in_month; $i++)
    {
        if (($first_day + $i + 1) % 7 >= 2)
            $counter++;
    }
    return $counter;
}
0 голосов
/ 11 февраля 2011

Нашел это решение без цикла for (не проверено с http://www.phpbuilder.com/board/archive/index.php/t-10267313.html)

function weekdays_in_month($month, $year)
{
$first = mktime(0,0,1,$month,1,$year);
// The first day of the month is also the first day of the
// remaining days after whole weeks are handled.
list($first_day,$days) = explode(' ',date('w t',$first));
$weeks = floor($days/7);
$weekdays = $weeks*5;
$remaining_days = $days-$weeks*7;

if($remaining_days==0)
return $weekdays; // Only happens most Februarys

$weekdays += $remaining_days-1;
// Neither starts on Sunday nor ends on Saturday
if($first_day!=0 && ($first_day+$days-1)%7!=6)
{ // Adjust for weekend days.
$weekdays += ($remaining_days<=(6-$first_day))-
($remaining_days>(6-$first_day));
}


return $weekdays;
}
0 голосов
/ 11 февраля 2011

Вы можете найти первое и последнее воскресенье в году, а затем разделить разницу в днях этих двух дат на 7. Сделайте то же самое для субботы, а затем вы можете вычесть количество воскресений и суббот из общего числа.количество дней в году.Это самое эффективное решение, которое я нашел до сих пор.

...