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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
lastdays
Отправлено: 31 Июля, 2015 - 14:29:57
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


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




Есть код

PHP:
скопировать код в буфер обмена
  1.  
  2. //- Текущее время
  3. $current_time = date('H:i:s');
  4. //- Время следующего бонуса
  5. $next_bonus = array('02:00:00', '03:00:00', '10:00:00', '12:00:00', '22:00:00', '24:00:00');
  6.  
  7.  


В общем реализован самый обычный таймер на javascript , мне необходимо пользователю показать, сколько времени осталось до следующего бонуса (ежедневно), в зависимости от данных в массиве $next_bonus.
Самый первый подходящий по времени.


Вроде просто на первый взгляд, но показывает не так, как задумывалось (в ночное время).
Помогите правильно реализовать и сравнить время.
 
 Top
andrewkard
Отправлено: 31 Июля, 2015 - 17:50:50
Post Id


Участник


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


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




lastdays
Пробуйте так:
PHP:
скопировать код в буфер обмена
  1.  
  2. //- Текущее время
  3. $current_time = time();
  4. //- Время следующего бонуса
  5. $next_bonus = array('02:00:00', '03:00:00', '10:00:00', '12:00:00', '22:00:00', '24:00:00');
  6.  
  7. foreach ($next_bonus as $time){
  8.     $time_bonus=strtotime($time);
  9.     if($time_bonus>$current_time){
  10.         $next_bonus=$time_bonus;
  11.         break;
  12.     }
  13. }
  14.  
  15. echo date('H:i:s',$next_bonus);
  16.  
 
 Top
lastdays
Отправлено: 31 Июля, 2015 - 17:57:17
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


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




я так и реализовал, только привел обе даты с помощью функции strtotime
Проблема в том, что мне нужно отчитать время до бонуса:
Следующий бонус через date('H:i:s',$next_bonus);

Конкретно время ночное дает сбой ( 23:00 и выше ), вернее я не правильно реализовал.


Короче если на таймере бонус в 2 ночи, а на часах 00:00 например, то считает до бонуса 11 часов, видимо косяк со следующим днем.

(Отредактировано автором: 31 Июля, 2015 - 18:07:39)

 
 Top
andrewkard
Отправлено: 31 Июля, 2015 - 18:09:16
Post Id


Участник


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


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




Остаток в сек. нужно переводить:

PHP:
скопировать код в буфер обмена
  1. //- Текущее время
  2. //$current_time = time();
  3. $current_time=strtotime('21:30:00');
  4. echo date('H:i:s',$current_time).'<br>';
  5.  
  6. //- Время следующего бонуса
  7. $next_bonus = array('02:00:00', '03:00:00', '10:00:00', '12:00:00', '22:00:00', '24:00:00');
  8.  
  9. foreach ($next_bonus as $str_time){
  10.     $time_bonus=strtotime($str_time);
  11.     if($time_bonus>$current_time){
  12.         $time=($time_bonus-$current_time);//sec
  13.         break;
  14.     }
  15. }
  16.  
  17. $sec = $time % 60;
  18. $time = floor($time / 60);
  19. $min = $time % 60;
  20. $time = floor($time / 60);
  21.  
  22. echo $time . ":" . $min . ":" . $sec;

(Отредактировано автором: 31 Июля, 2015 - 18:46:47)

 
 Top
lastdays
Отправлено: 31 Июля, 2015 - 22:43:30
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


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




Все равно не то, но спасибо.
Дело в том, что например 00:50:00 будет всегда меньше, чем 11:00:00.
В остальном код даже мой первый работает ровно, что то пока не доходит до меня как реализовать данную идею.
 
 Top
Мелкий Супермодератор
Отправлено: 31 Июля, 2015 - 23:16:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Осталось понять, нафига так сложно.

В минуте не 100 секунд, а 60. Но разве это мешает сравнивать?
PHP:
скопировать код в буфер обмена
  1. $aBonusesTime = [
  2. 20000, 30000, 100000, 120000, 220000, 240000
  3. ];
  4. $curtime = intval(date('His'));
  5. foreach ($aBonusesTime as $next) {
  6.     if ($next > $curtime) {
  7.         $next_bonus = $next;
  8.         break;
  9.     }
  10. }
  11. $rTimeToNextBonus = (new datetime())->diff(datetime::createFromFormat('His', $next_bonus));
  12. echo $rTimeToNextBonus->format('%H:%i:%s');


-----
PostgreSQL DBA
 
 Top
lastdays
Отправлено: 01 Августа, 2015 - 00:09:44
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


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




Поставил на локале час ночи.
Как итог 20000 не видит , $next_bonus не определен.

в 12:08:46 ночи

$curtime будет равен 846
в коде if ($next > $curtime)
т.е. 2000 > 846 не найдет вхождений, в общем тоже не тоНедовольство, огорчение
Пойду спать, со свежей головой думать нужно)
 
 Top
andrewkard
Отправлено: 02 Августа, 2015 - 20:49:11
Post Id


Участник


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


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




lastdays
lastdays пишет:
Дело в том, что например 00:50:00 будет всегда меньше, чем 11:00:00.


Не совсем понял Ваш комментарий, но по моему код работает верно:
PHP:
скопировать код в буфер обмена
  1.  
  2. //Тестируемое время
  3. $arr_time = array ('00:00:01','01:01:01','05:05:05','12:12:12','10:01:10','22:30:00','23:59:00','11:11:11','03:03:03','21:35:22','02:50:50','01:00:00');
  4. //Время следующего бонуса
  5. $arr_next_bonus = array('02:00:00', '03:00:00', '10:00:00', '12:00:00', '22:00:00', '24:00:00');
  6. //Выводим для сравнения время следующего бонуса
  7. echo join(', ',$arr_next_bonus).'<br>';  
  8. echo 'Тест_время | Бонус_время | Разница<br>';
  9.  
  10. //проверяем время в цикле и выводим свремя следующего бонуса
  11. foreach ($arr_time as $test_time){
  12. $time=strtotime($test_time);
  13.  
  14.         foreach ($arr_next_bonus as $bonus_time){
  15.                 $bonus=strtotime($bonus_time);
  16.                
  17.                 if($bonus>$time){
  18.                         $bonus=($bonus-$time);
  19.                         break;
  20.                 }
  21.         }
  22.        
  23.         echo $test_time.' | '.$bonus_time.' | '.date("H:i:s", mktime(0, 0, $bonus)).'<br>';
  24. }
  25.  
  26.  
 
 Top
Мелкий Супермодератор
Отправлено: 02 Августа, 2015 - 21:10:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




lastdays пишет:
т.е. 2000 > 846 не найдет вхождений, в общем тоже не то

А, вот оно что.
Я сперва написал на строчку больше:
PHP:
скопировать код в буфер обмена
  1. $aBonusesTime = [
  2. 20000, 30000, 100000, 120000, 220000, 240000
  3. ];
  4. $curtime = intval(date('His'));
  5. $next_bonus = min($aBonusesTime);
  6. foreach ($aBonusesTime as $next) {
  7.     if ($next > $curtime) {
  8.         $next_bonus = $next;
  9.         break;
  10.     }
  11. }
  12. $rTimeToNextBonus = (new datetime())->diff(datetime::createFromFormat('His', $next_bonus));
  13. echo $rTimeToNextBonus->format('%H:%i:%s');

Потом забыл, для чего min писал и удалил его Ниндзя


-----
PostgreSQL DBA
 
 Top
lastdays
Отправлено: 05 Августа, 2015 - 23:33:38
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


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




Понятно, что

Получит наименьшее значение в массиве, тем не менее не спасет.
Т.к. если я правильно понял, функция:
PHP:
скопировать код в буфер обмена
  1.  
  2. $rTimeToNextBonus = (new datetime())->diff(datetime::createFromFormat('His', $next_bonus));
  3. echo $rTimeToNextBonus->format('%H:%i:%s');
  4.  


Получает разницу между текущей датой(время) и то, что отдал наш массив.

На выходе вообще получаю тоже самое, вернее ничего.

23:33 ночи на часах
массив с нужными часами
PHP:
скопировать код в буфер обмена
  1. $massiv = [24000, 64000, 104000, 144000, 184000, 224000]


и соответственно ошибка вида
Warning: DateTime::diff() expects parameter 1 to be DateTime, boolean given in

В остальном, днем отрабатывает нормально скрипт. Как быть господа?Улыбка

(Отредактировано автором: 05 Августа, 2015 - 23:34:51)

 
 Top
Мелкий Супермодератор
Отправлено: 06 Августа, 2015 - 00:01:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Вот ведь. Любимые createFromFormat умеет только жадный поиск.
Мы нормально вычисляем ближайшую точку в будущем - 24000.
Дальше пытаемся распарсить и глупый createFromFormat берёт 24 как часы, 00 как минуты и удивляется оставшейся одной цифре "A two digit second could not be found".
Можно добавить ведущий ноль к строке или что-то в таком духе:
PHP:
скопировать код в буфер обмена
  1. $aBonusesTime = [
  2. 20000 => '02:00:00',
  3. 30000 => '03:00:00'
  4. ];
  5.  
  6. $curtime = intval(date('His'));
  7. ksort($aBonusesTime);
  8. $next_bonus = current($aBonusesTime);
  9. foreach ($aBonusesTime as $key=>$next) {
  10.     if ($key > $curtime) {
  11.         $next_bonus = $next;
  12.         break;
  13.     }
  14. }
  15.  
  16. $rTimeToNextBonus = (new datetime())->diff(datetime::createFromFormat('H:i:s', $next_bonus));
  17. echo $rTimeToNextBonus->format('%H:%i:%s');

Так не будет сносить крышу datetime.


-----
PostgreSQL DBA
 
 Top
lastdays
Отправлено: 06 Августа, 2015 - 00:09:32
Post Id



Частый гость


Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013  


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




=)
Забавный тупиковый случай, первый раз блин.
Все равно не то, если например 10:00:00 вечера, а следующая дата 02:00:00 ночи, то посчитает целый день до начала этой даты.
А хотелось что бы считал как 4 часа.

Предполагаю что нужно рыть в другую сторону..
 
 Top
Sail
Отправлено: 06 Августа, 2015 - 09:05:54
Post Id



Участник


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


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




lastdays пишет:
если например 10:00:00 вечера
, а каким образом Вы ему сообщили, что 10:00:00 именно вечера?
 
 Top
andrewkard
Отправлено: 06 Августа, 2015 - 10:56:37
Post Id


Участник


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


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




Теперь ясно, что если в массиве бонусов значение не найдено, бонус будет равен первому элементу массива бонусов (след. день), мой модифицированный скрипт:
PHP:
скопировать код в буфер обмена
  1.  
  2. echo $test = '21:00:00';
  3. $test_time=strtotime($test);
  4.  
  5. $arr_next_bonus = array('04:00:00', '05:00:00', '06:00:00', '12:00:00', '21:00:00', '21:30:00');
  6. $bonus=$arr_next_bonus['0'];
  7. foreach ($arr_next_bonus as $next_bonus){
  8.     $next_bonus_time=strtotime($next_bonus);
  9.     if ($test_time<$next_bonus_time){
  10.         $bonus=$next_bonus;
  11.         break;
  12.     }
  13. }
  14. echo '<br>'.$bonus;
  15.  
 
 Top
gizmo
Отправлено: 07 Августа, 2015 - 16:21:01
Post Id


Новичок


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


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




У вас правильная логика, только вы работаете с временем одного дня, что бы не было проблем с ночным временем, вам надо использовать полностью всю дату в формате 'Y-m-d H:i:s', перефодить ее во время и сравнивать
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB