Я пытаюсь вычислить количество дней недели (monda-friday) в определенный диапазон дат, используя PHP. Если пользователь вводит начало (2010-12-01) и дату окончания (2010-12-24), функция должна выплеснуть количество недельных дней в пределах этого диапазона дат.
Это то, что я нашел, но это не помогает.
function getworkingdays_time($STARTSTAMP, $ENDSTAMP){ $noofdays = ceil(($ENDSTAMP - $STARTSTAMP) / 86400); $sundaycounter = 0; $saturdaycounter = 0; $holidaycounter = 0; $offset = 0; $holidaycounter = check_holiday_range($STARTSTAMP, $ENDSTAMP); // check holiday range if(!defined("WORKSATURDAYS")) { define("WORKSATURDAYS", 0); } if(!defined("WORKSUNDAYS")) { define("WORKSUNDAYS", 0); } for ($i = 0; $i <= $noofdays; $i++){ $ts = $STARTSTAMP + ($i * 86400); if (WORKSATURDAYS == '0' && date("l", $ts) == "Saturday"){ ## they dont work saturdays $saturdaycounter ++; } elseif (WORKSUNDAYS == '0' && date("l", $ts) == "Sunday"){ ## they dont work sundays $sundaycounter ++; } } $total = $holidaycounter + $saturdaycounter + $sundaycounter; $offset = $total; if ($total > 0){ $total = getworkingdays_time($ENDSTAMP + 86400, ($ENDSTAMP + ($total * 86400) + 86400)); $offset += $total; } unset($holidaycounter, $saturdaycounter, $sundaycounter, $i, $noofdays, $ts, $total); return ($offset); }
Любая помощь будет оценена. Спасибо, кучи PSi
Вероятно, самый простой способ сделать это – разделить проблему на три части. Предполагая, что «недельные дни» – с понедельника по пятницу, тогда:
Добавьте результаты трех шагов и общее количество недельных дней в заданном диапазоне дат.
Для праздников вам лучше всего рассчитать количество праздников в диапазоне и вычесть из общей суммы.
Если вы работаете по субботам или воскресеньям, настройте подсчет в первые два шага и используйте число, отличное от 5, для множителя, как только вы определили, сколько полных недель находится в диапазоне.
Это упрощенный алгоритм, с которым я столкнулся. К сожалению, он находится на Python, но он может быть адаптирован к другим языкам, которые, я считаю. Ожидается, что аргументы функции (start, end)
будут временными кортежами.
def find_work_days(start,end): days = (end.tm_yday - start.tm_yday) + 1 weeks = days / 7 leftover = days % 7 if start.tm_wday + leftover == 6: leftover -= 1 elif start.tm_wday + leftover > 6: leftover -= 2 if start.tm_wday == 6: leftover += 1 work_days = weeks * 5 + leftover return work_days