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

Форум PHP

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

 

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

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

тема: Прибавить Рабочие дни к date()
 
 автор: tima2010   (11.02.2014 в 12:03)   письмо автору
 
 

Привет,

не могу понять где ошибся.

Пишу код для прибавления к текущей дате N количество рабочих дней. В неделе 5 рабочих дней (пн,вт,ср,чт,пт)

<?php
/* Сколько дней прибавить*/
$days          = 20;

/* Сколько недель в рабочих днях */
$week          = $days > 5 ? ceil($days / 7) : 0 ;

/* Получаем количество выходных */
$holiday       = $week * 2;

/* Суммируем дни */
$all_days      = $days + $holiday;

/* Получаем дату */
echo date("d-m-Y", time() + 3600 * 24 * $all_days);


Прибавив к 11-02-2014 рабочие дни, скрипт должен отобразить: 11-03-2014

Но получаю: 09-03-2014

В каких днях я ошибся?

  Ответить  
 
 автор: confirm   (11.02.2014 в 12:20)   письмо автору
 
   для: tima2010   (11.02.2014 в 12:03)
 

А с чего вы решили, что если 3 недели, то обязательно и 6 дней выходных? У вас что предполагается, что в любом случае ваши дни берут начало с понедельника?
20 дней / на 7 дней, это никак не 3 недели, округление тут это ошибка, так как это 3, но не полных недели.

  Ответить  
 
 автор: Trianon   (11.02.2014 в 12:26)   письмо автору
 
   для: tima2010   (11.02.2014 в 12:03)
 

Скрипт не учитывает текущий день недели.
Простейший опровергающий пример. Допустим, Вам нужно прибавить 1 (один) день.
Перескок через выходные должен происходить лишь в пятницу, но поскольку ceil округляет число вверх, то он будет выполнен в любом случае.

А вообще, считать рабочие дни строго с пн по пт - это несколько в стороне от реалий.
Рабочие дни определяются производственным календарем.

  Ответить  
 
 автор: tima2010   (11.02.2014 в 13:19)   письмо автору
 
   для: Trianon   (11.02.2014 в 12:26)
 

confirm,
Trianon, >> Рабочие дни определяются производственным календарем.
Скрипт будет использоваться в личных целях, когда рабочие дни именно с пн-пт )

Спасибо.

<?php
function working_days($count) {

    
$date              = date( 'd-m-Y' );
    
    
$day_week          = date( 'N', strtotime( $date ) );
    
    
$day_count         = $count + $day_week;
    
    
$week_count        = floor($day_count/5);
    
    
$holiday_count     = ( $day_count % 5 > 0 ) ? 0 : 2;
    
    
$week_day          = $week_count * 7 - $day_week + ( $day_count % 5 ) - $holiday_count;
    
    
$date_end          = date( "d-m-Y", strtotime( $date . " + $week_day day " ) );
    
    
$date_end_count    = date( 'N', strtotime( $date_end ) );
    
    
$holiday_shift     = $date_end_count > 5 ? 7 - $date_end_count + 1 : 0;
    
    return 
date("d-m-Y", strtotime($date_end . " + $holiday_shift day "));
}

echo 
working_days(20);

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

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