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
Форумы портала PHP.SU :: Версия для печати :: Выкинуть часы/дни из даты
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Выкинуть часы/дни из даты

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

1. demot - 16 Мая, 2011 - 11:27:44 - перейти к сообщению
Пишу нечто вроде 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. }

Кто подскажет есть ли ошибка и в чем, исходя из условий задачи?
2. demot - 16 Мая, 2011 - 13:29:36 - перейти к сообщению
Сам нашел косяк. Если заявка принимается после 19-00 в пятницу, то сроком будет понедельник 19.00. То же, если принята в четверг или в среду после 19.00.

В общем кошмар, завис я на этом!
3. demot - 16 Мая, 2011 - 14:04:43 - перейти к сообщению
Может кто все-таки поможет составить функцию. Я даже все красиво нарисовал, чтоб понятней было что требуется Улыбка
4. zypikov - 16 Мая, 2011 - 14:51:16 - перейти к сообщению
demot, так что функция неправильно работает??
Админы, исправьте маленький косяк, вводящий неопытный народ в заблуждение в описании на сайте функции date(). В первом примере будет не Wednesday, a Monday)
5. demot - 16 Мая, 2011 - 15:40:22 - перейти к сообщению
не, неправильно, слишком много нюансов.
6. Саныч - 16 Мая, 2011 - 16:51:28 - перейти к сообщению
чего-то меня заинтересовала ваша задача, написал функцию
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() без параметра

Проверяйте...
7. demot - 16 Мая, 2011 - 17:06:48 - перейти к сообщению
Саныч пишет:
Проверяйте...

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

вызываю 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
8. Саныч - 16 Мая, 2011 - 22:12:41 - перейти к сообщению
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

я думал можно присваивать и значение функции, оказалось нет(
9. demot - 17 Мая, 2011 - 09:30:38 - перейти к сообщению
Спасибо еще раз, все работает чудненько, правда пришлось немножко подкорректировать
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-х.
10. Саныч - 17 Мая, 2011 - 12:53:14 - перейти к сообщению
demot, вы как раз таки и сделали 3 дня, вместо двух, которые были прописаны...
вы удалили часть, которая отвечала за пятницу и теперь, если кто-то оформит заказ, к примеру, в пятницу в 14.00, то его окончание будет в понедельник в 14.00, а не в среду как вы хотели...
11. demot - 17 Мая, 2011 - 13:37:49 - перейти к сообщению
Саныч пишет:
demot, вы как раз таки и сделали 3 дня, вместо двух, которые были прописаны...
вы удалили часть, которая отвечала за пятницу и теперь, если кто-то оформит заказ, к примеру, в пятницу в 14.00, то его окончание будет в понедельник в 14.00, а не в среду как вы хотели...

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

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

Странно конечно, уже столько рабочего функционала готово, а запнулся на, казалось бы, такой ерунде.
12. Саныч - 17 Мая, 2011 - 16:09:22 - перейти к сообщению
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. }


проверяйте...
13. demot - 17 Мая, 2011 - 16:22:14 - перейти к сообщению
О, вот теперь все четко, кажись! Еще раз огромное спасибо!
14. EuGen - 17 Мая, 2011 - 16:38:28 - перейти к сообщению
Можно еще так:
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.  

Детально не проверял, но думаю, идея ясна (как избежать кучи условий)
15. demot - 17 Мая, 2011 - 16:44:53 - перейти к сообщению
Большое спасибо EuGen, буду проверять.

 

Powered by ExBB FM 1.0 RC1