Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчет количества рабочих дней в датах
 
 автор: p.pavluxa   (29.04.2014 в 15:52)   письмо автору
 
 

Здравствуйте. Подскажите как написать скрипт который будет зная две даты посчитывать сколько в них рабочих дней? (т.е считать сумму количеств дней всех кроме субботы и воскресенья)?

  Ответить  
 
 автор: confirm   (29.04.2014 в 18:02)   письмо автору
 
   для: p.pavluxa   (29.04.2014 в 15:52)
 

1. Получить количество дней между датами.
2. Если первая дата это понедельник, то нужно отнять от этих дней 2 * на целое полученное как число дней деленных на 7.
3. Если первая дата не понедельник, то взять из начала дат дни до понедельника минус 2 дня. Выполнить действие из п. 2.
4. Приплюсовать остаток от деления по п. 2.

  Ответить  
 
 автор: Саня   (29.04.2014 в 18:10)   письмо автору
 
   для: p.pavluxa   (29.04.2014 в 15:52)
 

Суббота и воскресенье не всегда являются выходными днями. Так же как и некоторые будни могут быть выходными.

Решение видится мне следующим образом:
1. Берётся производственный календарь и из него составляется массив вида
<?
$calend 
= [
  
2014 => [
    
=> [12345678111218192526], // январь
    
=> [128915162223], // февраль
   // ... и так далее для каждого месяца ...
  
],
  
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. Ровно такое количество рабочих дней было в январе этого года.

Плюсы: учитываются все официальные праздники. Можно легко адаптировать для различных нужд бухгалтерии, связанных с расчётами зарплат и других данных, завязанных на производственный календарь.

Минусы: много времени нужно потратить на составление массива с праздниками. Массив нужно актуализировать каждый год.

  Ответить  
 
 автор: confirm   (29.04.2014 в 18:13)   письмо автору
 
   для: Саня   (29.04.2014 в 18:10)
 

>Массив нужно актуализировать каждый год

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования