Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выкинуть часы/дни из даты

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: Call-центр
demot
Отправлено: 16 Мая, 2011 - 11:27:44
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




Пишу нечто вроде call-центра. Так вот, служба оформляет заявки в любое время.
Монтеры выполняют заявки по рабочим дням ПН-ПТ и с 9.00 до 19.00.
Срок выполнения заявки 3 рабочих дня.
Время в базе хранится в unixtime.

В чем суть проблемы. Когда оформляется заявка, время составления указывается текущее (независимо от времени и дня недели), а вот срок выполнения должен быть:
1. Если это суббота или воскресенье, то 19.00 среды.
2. Если будний день, и время рабочее, то ровно 3-е суток.
3. Если будний день и время до 9.00 или после 19.00, то срок 19.00 на третьи сутки.

Начал так:
PHP:
скопировать код в буфер обмена
  1. $current_time = time();
  2. function request_time($current_time){
  3.     if (date("H")<19 && date("H")>9 && date("w")!=0 && date("w")!=6) {
  4.         $limit_time = date("d.m.Y H:i",$current_time+259200);
  5.     }
  6.     return $limit_time;
  7. }
  8. echo request_time($current_time);


По идее надо еще кучу elseif дописать. Но дальше для меня пошла головоломка. Может кто сможет подсказать более вразумительное решение данной задачи.
Вывожу время пока в "удобном" формате, чтоб можно было наглядно смотреть правильно ли работает функция.
(Добавление)
О, вот что придумал.
PHP:
скопировать код в буфер обмена
  1. $current_time = time();
  2. function request_time($current_time){
  3.     if (date("H")<19 && date("H")>9 && date("w")!=0 && date("w")!=6) {
  4.         $limit_time = date("d.m.Y H:i",$current_time+259200);
  5.     } elseif (date("H")>19 || date("H")<9 && date("w")!=0 && date("w")!=6) {
  6.         $limit_time = date("d.m.Y 19:00",$current_time+259200);
  7.     } elseif (date("w")==6){
  8.         $limit_time = date("d.m.Y 19:00",$current_time+345600);
  9.     } elseif (date("w")==0){
  10.         $limit_time = date("d.m.Y 19:00",$current_time+259200);
  11.     }
  12.     return $limit_time;
  13. }

Кто подскажет есть ли ошибка и в чем, исходя из условий задачи?

(Отредактировано автором: 16 Мая, 2011 - 11:29:36)

 
 Top
demot
Отправлено: 16 Мая, 2011 - 13:29:36
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




Сам нашел косяк. Если заявка принимается после 19-00 в пятницу, то сроком будет понедельник 19.00. То же, если принята в четверг или в среду после 19.00.

В общем кошмар, завис я на этом!
 
 Top
demot
Отправлено: 16 Мая, 2011 - 14:04:43
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




Может кто все-таки поможет составить функцию. Я даже все красиво нарисовал, чтоб понятней было что требуется Улыбка
Прикреплено изображение (Нажмите для увеличения)
1.png
 
 Top
zypikov
Отправлено: 16 Мая, 2011 - 14:51:16
Post Id



Частый гость


Покинул форум
Сообщений всего: 219
Дата рег-ции: Нояб. 2010  


Помог: 3 раз(а)




demot, так что функция неправильно работает??
Админы, исправьте маленький косяк, вводящий неопытный народ в заблуждение в описании на сайте функции date(). В первом примере будет не Wednesday, a Monday)


-----
У всего есть обратная сторона.
 
 Top
demot
Отправлено: 16 Мая, 2011 - 15:40:22
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




не, неправильно, слишком много нюансов.
 
 Top
Саныч Модератор
Отправлено: 16 Мая, 2011 - 16:51:28
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




чего-то меня заинтересовала ваша задача, написал функцию
PHP:
скопировать код в буфер обмена
  1. function request_time($t = time())
  2. {
  3.         if(date('w',$t) == 6 || date('w',$t) == 0)
  4.                 return mktime(19,0,0,date('n',$t),date('j',$t) + (date('w',$t) == 0 ? 3 : 4),date('Y',$t));
  5.         if(date('G',$t) < 9)
  6.                 return mktime(19,0,0,date('n',$t),date('j',$t) + (date('w',$t) == 4 ? 4 : (date('w',$t) == 5 ? 3 : 2)),date('Y',$t));
  7.         if(date('G',$t) >= 19)
  8.                 return mktime(19,0,0,date('n',$t),date('j',$t) + (date('w',$t) == 3 ? 5 : (date('w',$t) == 4 ? 4 : (date('w',$t) == 5 ? 3 : 2))),date('Y',$t));
  9.         return mktime(date('G',$t),date('i',$t),date('s',$t),date('n',$t),date('j',$t) + (date('w',$t) == 3 ? 5 : (date('w',$t) == 4 ? 4 : (date('w',$t) == 5 ? 3 : 2))),date('Y',$t));
  10. }

параметр - unix-время оформления заказа, возвращается unix-время истечения заказа...
если заказ оформлен только-что то вызываем просто request_time() без параметра

Проверяйте...


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
demot
Отправлено: 16 Мая, 2011 - 17:06:48
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




Саныч пишет:
Проверяйте...

Египетская сила! Не понял
Спасибо большое, буду проверять!

вызываю echo date("d.m.Y H:i",request_time());

Warning: date() expects parameter 2 to be long, string given in Z:\home\localhost\www\test.php on line 4

Warning: date() expects parameter 2 to be long, string given in Z:\home\localhost\www\test.php on line 4

Warning: date() expects parameter 2 to be long, string given in Z:\home\localhost\www\test.php on line 5

Warning: date() expects parameter 2 to be long, string given in Z:\home\localhost\www\test.php on line 5

Warning: date() expects parameter 2 to be long, string given in Z:\home\localhost\www\test.php on line 5

Warning: date() expects parameter 2 to be long, string given in Z:\home\localhost\www\test.php on line 5

И возвращает "левую" дату:
03.12.1999 19:00

(Отредактировано автором: 16 Мая, 2011 - 19:53:08)

 
 Top
Саныч Модератор
Отправлено: 16 Мая, 2011 - 22:12:41
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




demot пишет:
И возвращает "левую" дату:

подправил немного...
PHP:
скопировать код в буфер обмена
  1. function request_time($t = 0)
  2. {
  3.         if($t === 0) $t = time();
  4.         if(date('w',$t) == 6 || date('w',$t) == 0)
  5.                 return mktime(19,0,0,date('n',$t),date('j',$t) + (date('w',$t) == 0 ? 3 : 4),date('Y',$t));
  6.         if(date('G',$t) < 9)
  7.                 return mktime(19,0,0,date('n',$t),date('j',$t) + (date('w',$t) == 4 ? 4 : (date('w',$t) == 5 ? 3 : 2)),date('Y',$t));
  8.         if(date('G',$t) >= 19)
  9.                 return mktime(19,0,0,date('n',$t),date('j',$t) + (date('w',$t) == 3 ? 5 : (date('w',$t) == 4 ? 4 : (date('w',$t) == 5 ? 3 : 2))),date('Y',$t));
  10.         return mktime(date('G',$t),date('i',$t),date('s',$t),date('n',$t),date('j',$t) + (date('w',$t) == 3 ? 5 : (date('w',$t) == 4 ? 4 : (date('w',$t) == 5 ? 3 : 2))),date('Y',$t));
  11. }
  12. echo date("d.m.Y H:i",request_time()); //вернуло 18.05.2011 19:00

я думал можно присваивать и значение функции, оказалось нет(


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
demot
Отправлено: 17 Мая, 2011 - 09:30:38
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




Спасибо еще раз, все работает чудненько, правда пришлось немножко подкорректировать
return mktime(date('G',$t),date('i',$t),date('s',$t),date('n',$t),date('j',$t) + (date('w',$t) == 3 ? 5 : (date('w',$t) == 4 ? 4 : (date('w',$t) == 5 ? 3 : 2))),date('Y',$t));
заменить на
return mktime(date('G',$t),date('i',$t),date('s',$t),date('n',$t),date('j',$t) + (date('w',$t) == 3 ? 5 : (date('w',$t) == 4 ? 4 : 3)),date('Y',$t));
Т.к. если понедельник или вторник, то добавляло только 2 дня, вместо 3-х.
 
 Top
Саныч Модератор
Отправлено: 17 Мая, 2011 - 12:53:14
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




demot, вы как раз таки и сделали 3 дня, вместо двух, которые были прописаны...
вы удалили часть, которая отвечала за пятницу и теперь, если кто-то оформит заказ, к примеру, в пятницу в 14.00, то его окончание будет в понедельник в 14.00, а не в среду как вы хотели...


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
demot
Отправлено: 17 Мая, 2011 - 13:37:49
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




Саныч пишет:
demot, вы как раз таки и сделали 3 дня, вместо двух, которые были прописаны...
вы удалили часть, которая отвечала за пятницу и теперь, если кто-то оформит заказ, к примеру, в пятницу в 14.00, то его окончание будет в понедельник в 14.00, а не в среду как вы хотели...

Да, вы правы. Вернул назад, но ситуация не изменилась, т.е. заявки оформленные в пятницу истекают в понедельник вместо среды.

И тогда все же получается что заявки понедельника и вторника имеют срок в двое суток, а не трое.

Странно конечно, уже столько рабочего функционала готово, а запнулся на, казалось бы, такой ерунде.

(Отредактировано автором: 17 Мая, 2011 - 13:42:37)

 
 Top
Саныч Модератор
Отправлено: 17 Мая, 2011 - 16:09:22
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




demot пишет:
заявки оформленные в пятницу истекают в понедельник вместо среды

исправил Улыбка
PHP:
скопировать код в буфер обмена
  1. function request_time($t = 0)
  2. {
  3.         if($t === 0) $t = time();
  4.         if(date('w',$t) == 6 || date('w',$t) == 0)
  5.                 return mktime(19,0,0,date('n',$t),date('j',$t) + (date('w',$t) == 0 ? 3 : 4),date('Y',$t));
  6.         if(date('G',$t) < 9)
  7.                 return mktime(19,0,0,date('n',$t),date('j',$t) + (date('w',$t) == 4 || date('w',$t) == 5 ? 4 : 2),date('Y',$t));
  8.         if(date('G',$t) >= 19)
  9.                 return mktime(19,0,0,date('n',$t),date('j',$t) + (date('w',$t) != 1 && date('w',$t) != 2 ? 5 : 3),date('Y',$t));
  10.         return mktime(date('G',$t),date('i',$t),date('s',$t),date('n',$t),date('j',$t) + (date('w',$t) != 1 && date('w',$t) != 2 ? 5 : 2),date('Y',$t));
  11. }


проверяйте...

(Отредактировано автором: 17 Мая, 2011 - 16:16:04)



-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
demot
Отправлено: 17 Мая, 2011 - 16:22:14
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




О, вот теперь все четко, кажись! Еще раз огромное спасибо!
 
 Top
EuGen Администратор
Отправлено: 17 Мая, 2011 - 16:38:28
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Можно еще так:
PHP:
скопировать код в буфер обмена
  1.  
  2. function requestTime($time=null)
  3. {
  4.    if(!isset($time))
  5.    {
  6.       $time=time();
  7.    }
  8.    $iWeekHour=(int)((date('w', $time)+1)*24+date('H', $time));
  9.    $rgWorkNormal=array_merge(range(9,19),range(9+24,19+24),range(9+2*24, 19+2*24),range(9+3*24,19+3*24),range(9+4*24,19+4*24));
  10.    $rgHolydays=range(0+6*24,23+7*24);
  11.    if(in_array($iWeekHour, $rgHolyDays))
  12.    {
  13.       return date('Y-m-d H:i:s', strtotime(date('Y-m-d H:i:s', $time).' next Wednesday 19:00:00'));
  14.    }
  15.    elseif(in_array($iWeekHour, $rgWorkNormal))
  16.    {
  17.       return date('Y-m-d H:i:s', strtotime(date('Y-m-d H:i:s', $time).' + 3 day'));
  18.    }
  19.    else
  20.    {
  21.       return date('Y-m-d H:i:s', strtotime(date('Y-m-d', $time).' 19:00:00 + 3 day'));
  22.    }
  23. }
  24. $date=requestTime();
  25. echo($date);
  26.  

Детально не проверял, но думаю, идея ясна (как избежать кучи условий)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
demot
Отправлено: 17 Мая, 2011 - 16:44:53
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




Большое спасибо EuGen, буду проверять.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB