|
|
|
| Здравствуйте. Подскажите как написать скрипт который будет зная две даты посчитывать сколько в них рабочих дней? (т.е считать сумму количеств дней всех кроме субботы и воскресенья)? | |
|
|
|
|
|
|
|
для: p.pavluxa
(29.04.2014 в 15:52)
| | 1. Получить количество дней между датами.
2. Если первая дата это понедельник, то нужно отнять от этих дней 2 * на целое полученное как число дней деленных на 7.
3. Если первая дата не понедельник, то взять из начала дат дни до понедельника минус 2 дня. Выполнить действие из п. 2.
4. Приплюсовать остаток от деления по п. 2. | |
|
|
|
|
|
|
|
для: p.pavluxa
(29.04.2014 в 15:52)
| | Суббота и воскресенье не всегда являются выходными днями. Так же как и некоторые будни могут быть выходными.
Решение видится мне следующим образом:
1. Берётся производственный календарь и из него составляется массив вида
<?
$calend = [
2014 => [
1 => [1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 18, 19, 25, 26], // январь
2 => [1, 2, 8, 9, 15, 16, 22, 23], // февраль
// ... и так далее для каждого месяца ...
],
2015 => [...], // и т.д. для каждого интересующего года
];
|
То есть перечисляем все праздничные и выходные дни каждого месяца каждого года (в пределах лет, между которыми планируется делать расчёты).
Это довольно нудная задача, но не сложная.
2. Пишется код:
<?
$from = strtotime('2014-01-01');
$to = strtotime('2014-01-31');
$days = 0;
while ( $from <= $to ) {
$y = intval(date('Y', $from));
$m =intval(date('n', $from));
$d =intval(date('j', $from));
if ( !in_array($d, $calend[$y][$m]) ) {
++$days;
}
$from = strtotime('+1 day', $from);
}
print 'Рабочих дней: '.$days;
|
В результате выполнения этого кода получим 17. Ровно такое количество рабочих дней было в январе этого года.
Плюсы: учитываются все официальные праздники. Можно легко адаптировать для различных нужд бухгалтерии, связанных с расчётами зарплат и других данных, завязанных на производственный календарь.
Минусы: много времени нужно потратить на составление массива с праздниками. Массив нужно актуализировать каждый год. | |
|
|
|
|
|
|
|
для: Саня
(29.04.2014 в 18:10)
| | >Массив нужно актуализировать каждый год
И каждый праздничный месяц, следя за думой и правительством - что им на этот раз взбредет что-то куда-то перенести. ) | |
|
|
|