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

Форум PHP

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

 

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

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

тема: Отсчет каждые 3 часа
 
 автор: tima2010   (07.10.2013 в 13:59)   письмо автору
 
 

Всем добрый день,

столкнулся с проблемой при реализации скрипта обратный отсчет.

Чтобы отображать отсчет каждые 24 часа - точку отсчета вычисляю так:


<?php
$time     
date('H:i:s'time() + 4*60*60); // сейчас

$last     strtotime('23:59:59') - strtotime($time); // 24 ч минус сейчас

$start     date('H:i:s'$last); // сколько осталось
?>


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

Спасибо.

CRONа нет.

  Ответить  
 
 автор: confirm   (07.10.2013 в 20:05)   письмо автору
 
   для: tima2010   (07.10.2013 в 13:59)
 

Получить метку времени через некий интервал несложно и гораздо проще, чем вы делаете.
Но что значит запускать таймер через каждые 24 часа? Ведь для этого ваш скрипт должен быть запущен постоянно чтобы контролировать текущее время. А значит нужно делать примерно так.

  Ответить  
 
 автор: tima2010   (07.10.2013 в 20:18)   письмо автору
 
   для: confirm   (07.10.2013 в 20:05)
 

Извиняюсь, не верно выразился, скрипт просто напросто отображает цифры от определенной точки отсчета используя JS. (таймер обратного отсчета jquery-countdown plugin - v0.2)

При помощи PHP указываю сколько еще осталось до Х.

Нужно чтобы таймер начинал отсчет заново каждые 3 часа.

>> Получить метку времени через некий интервал несложно и гораздо проще, чем вы делаете.

Пожалуйста, расскажите подробнее. Спасибо.

  Ответить  
 
 автор: confirm   (07.10.2013 в 20:47)   письмо автору
 
   для: tima2010   (07.10.2013 в 20:18)
 

Значит не верно выразились.

Если говорить о счетчике, то он как раз и служит для того, чтобы показывать сколько осталось до времени Х, а не РНР должен это указывать. РНР вы можете задать стартовое время счетчика, то есть контролировать именно это время.

Но задать старт счетчика, это просто, а вот контролировать его, это уже вопрос. Проще всего записывать на клиенте текущее время счетчика в куки. При старте страницы, клиентский скрипт получает стартовое время из кук и считает с этого времени.

Но не все же честные, есть же "продвинутые юзеры", которые такой подход могут превратить в вечный счетчик. Поэтому лучше при работе счетчика передавать его текущее состояние на сервер, и хранить его для идентификатора установленного в куках клиента. При выдаче страницы, если нет куки с установленным идентификатором, значит начальное стартовое время, если есть, то стартовое время, которое сохранено для идентификатора.

А получить интервалы времени проще так:
<?
$start 
= new DateTime('2013-01-01 01:24:00'); //какая-то метка с которой ведется отсчет
$interval = new DateInterval('PT24H'); //заданный интервал равный 24 часам
//следующая метка времени через интервал 24 часа от стартовой метки
$new $start->add($interval);
//можно получить массив временных меток от стартовой метки до какой либо конечной, например текущего времени
$end = new DateTime(); //текущее время
$period =  new DatePeriod($start$interval$end); //массив временных меток с интервалом 24 часа 


P.S. Если вы используете плагин от Martin Conte Mac Donell, то могу сказать, что этот плагин глючный. В младших версиях IE глюки, да и вообще в IE у него наблюдаются глюки.

  Ответить  
 
 автор: tima2010   (07.10.2013 в 21:20)   письмо автору
37.9 Кб
 
   для: confirm   (07.10.2013 в 20:47)
 

Да, при помощи PHP я и хочу задать точку отсчета. Причем каждые 3 часа эта точка отсчета становится снова 2.59

прикрепил файл.

Как я себе изначально представлял решение:

Делим 24 часа на 8 частей, получаем по 3 часа в 1 части
Счетчик должен начинать новый отсчет каждые 3 часа.
Узнаем текущее время.. и тут застрял ))
Не могу сообразить как формула должна работать

Нужно узнать в какую часть входит текущее время (1-8)

(24ч / 8) - (?) = начало счетчика

  Ответить  
 
 автор: confirm   (07.10.2013 в 22:36)   письмо автору
 
   для: tima2010   (07.10.2013 в 21:20)
 

Что то совсем запутанно, то через каждые 24, то почему то восемь раз по три....

Есть у вас некая временная метка, пусть для примера будет текущее время, от нее вы узнаете следующую метку равную +3 часа. Это сделать можно с помощью функции strtotime(), или так как показывал:
<?
$start 
= new DateTime(); //текущее время
//эту метку мы запомнили, в базе например
//следующую метку мы получаем плюсуя 3 часа
$interval = new DateInterval('PT3H'); //интервал 3 часа
$start $start->add($interval);
echo 
$start->format('Y-m-d H:i:s'); //следующая метка через 3 часа
//получили ее и запомнили
//следующая метка уже будет получатся от этой запомненной
//выше приведенным способом


Зачем что-то делить? Если вам нужно от какой-то метки получить заведомо N меток через интервал указанный, то я же писал как. Но вроде бы не это главное. Как вы будет знать, что надо именно от какой-то метки получить интервал, если ваш скрипт не запущен постоянно, а запрос его произойдет во время совсем не синхронное с вашими метками?

Я вам написал как я представляю себе контроль времени Х, и этот контроль происходит не в реальном масштабе времени, а учитывает время нахождения пользователя в онлайн. И только в периоды этого времени можно принять решение - проскочил ли на данный момент пользователь время Х или нет, нужно ли устанавливать ему новый старт и с какого времени. То есть все сводится к проверке на условия, ибо синхронизировать действия пользователя и работу ваших часов нельзя.

Случаем не этот плагин используете? Если да, то читайте тут, глючный он.

  Ответить  
 
 автор: tima2010   (08.10.2013 в 09:17)   письмо автору
 
   для: confirm   (07.10.2013 в 22:36)
 

Костылем решил вопрос так, но по какой то причине показывает на час больше чем должно быть.

По времени, чтобы сократить код взял 12-часовой формат. Разделил на 4 части.


<?php
/* Часы секторов в 12 часовом формате */
$time = array(
    
'1' => array(
        
'12',
        
'01',
        
'02'
    
),
    
'2' => array(
        
'03',
        
'04',
        
'05'
    
),
    
'3' => array(
        
'06',
        
'07',
        
'08'
    
),
    
'4' => array(
        
'09',
        
'10',
        
'11'
    
)
);
/* Окончание сектора времени */
$end = array(
    
'1' => '02:59:59',
    
'2' => '05:59:59',
    
'3' => '08:59:59',
    
'4' => '11:59:59'
);

$current_H     date('h'time() + 4*60*60); // Который сейчас час
$current_T     date('h:i:s'time() + 4*60*60); // Сколько сейчас времени

foreach($time as $k => $v)
{
    
/* Ищем сектор текущего часа */
    
if(in_array($current_H$v))
    {
        
/* Отнимаем от окончания времени сектора текущее время */
        
$last strtotime($end[$k]) - strtotime($current_T); 
        
/*
        Получаем, сколько времени осталось до окончания сектора
        Но по какой то причине отображает на 1 час больше...
        Можно конечно сделать так, но опять костыль:
        $last_date = date('h:i:s', $last);
        echo date('h:i:s', strtotime("$last_date -1 hours"));
        */
        
echo date('h:i:s'$last);
    }
}

  Ответить  
 
 автор: confirm   (08.10.2013 в 17:20)   письмо автору
 
   для: tima2010   (08.10.2013 в 09:17)
 

Я вам про Фому, а вы все про Ерему.
Я смотрю на вашу математику и не понимаю чего вы вытворяете, и чего вам надо. Вы бы уж лучше словами описали задачу, и не как 4 х 5, и почему получает 21 при этом, а суть и условия решаемой задачи.

Время, это просто временная метка, у которой есть "условное начало" отсчета. Зная это начало и добавив к нему некое смещение, и будем находится в нужной нам временной метке. А зная некий период, и зная сколько шагов с этим периодом нужно сделать, можно всегда переместиться во временную метку на S шагов с периодом P. Держать для этого в уме или записывать на клочке бумаги промежуточные временные метки совсем не обязательно, их легко получить. А также легко узнать входит ли некая временная метка в диапазон между двумя крайними или равна ли временной метке шага N с периодом P.

Ваша математика мне не понятна. Например, "Который сейчас час", это не

date('h', time() + 4*60*60)

а

date('h')

Зачем смещение в 4 часа? Не зная чего вы там в уме держите, и ни слова не говорите чего же все таки по сути вы решаете, хотя я уже дважды писал что я представляю себе, я вам ничего конкретного по вашей голой математике сказать не могу.

  Ответить  
 
 автор: tima2010   (08.10.2013 в 17:34)   письмо автору
 
   для: confirm   (08.10.2013 в 17:20)
 

Спасибо за развернутые ответы, да объяснять я точно не умею.

Почему + 4 часа - потому, что время на сервере которое возвращает date('h') на 4 часа меньше чем время где я живу.

Задача была такая:
На сайте размещен счетчик обратного отсчета который просто показывает цифры.
Нужно реализовать так, чтобы счетчик всегда начинал отсчет от 02:59:59 до 00:00:00 (не часов а интервал времени, 3 часа). То есть отсчет должен быть всегда по 3 часа.

Чтобы выяснить, с какого времени счетчику начинать отчет ищем метку времени сколько еще осталось до окончания 3-х часового периода.

Скрипт на JS который отображает счетчик работает так: Задаем точку отсчета. Далее он просто начинает отображать:
02:59:59
02:59:58
02:59:57
02:59:58
... итд.

  Ответить  
 
 автор: confirm   (08.10.2013 в 18:41)   письмо автору
 
   для: tima2010   (08.10.2013 в 17:34)
 

Время как тип и величина, которой оперирует язык, хоть и условная точка отсчета, но все таки подчиняется законам течения времени. А вы трактуете эту величину на свое усмотрение.

Что значит "меньше чем время где я живу"? Вы счетчик только для себя делаете, не смотря на то, что он на вашем сайте, или для всех? Что вы этим хотите сказать, какое время вы хотите показывать у клиента? И почему текущее +4 для клиента у которого разница с сервером вообще может быть от 0 до плюс/минус 11 станет одним и тем же для всех?

Я работаю над заказом, я не могу более говорить много, некогда. Но если, к примеру, у ваших пользователей должно отображаться время вашего часового пояса не зависимо от часового пояса реального сервера, то необходимо знать:

а) сервер может находится в часовом поясе, в котором принят или нет переход на летнее время;

б) ваши клиенты могут находится в различных часовых поясах, в которых тоже может быть принят или нет переход на летнее время;

в) РНР возвращает смещение часового пояса для расположенных западнее UTC как отрицательное значение, а расположенных восточнее UTC - положительное;

г) JavaScript на клиенте возвращает смещение часового пояса для расположенных западнее UTC как положительное значение, а расположенных восточнее UTC - отрицательное.

Зная это, можно показывать всем клиентам ваше время, не зависимо от временной зоны клиента и сервера. Для этого нужно передавать клиенту всего одну величину - свое смещение (клиентское) с его знаком. Вот пример таких часов:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>

<script>
//szn - клиентское смещение, которое будет определять текущее время для всех клиентов  
var szn = 4*60*60,cal="воскресенье,понедельник,вторник,среда,четверг,пятница,суббота,Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь".split(',');
function date(t) {
  function pad(n, c) {
     if ((n = n + '').length < c) return new Array((++c) - n.length).join('0') + n;
     return n;
  }
 
  d = t == null ? new Date() : (t instanceof Date ? new Date(t) : new Date(t * 1000));
  return [cal[d.getDay()], cal[6 + d.getMonth() + 1], d.getDate(), d.getFullYear(),  
          [d.getHours(), pad(d.getMinutes(), 2), pad(d.getSeconds(), 2)].join(':')]; 
}

function outTime() {
   //здесь рассчитывается разность переданного смещения и смещения клиента
   //по которой корректируется локальное время клиента для отображения 
   var tm = date((new Date).getTime()/1000+szn+(new Date).getTimezoneOffset()*60),
       elt = document.getElementById('tm').children;
   
   for(var k=0; k<5; k++) elt[k].innerHTML = tm[k];
   
   setTimeout('outTime()',1000);   
}

$(function(){
    outTime();
});  
</script>

<div id="tm">Время которое у меня: <span class="dayweek"></span>, 
      <span class="month"></span> <span class="day"></span>, 
      <span class="year"></span> <span class="times"></span>
</div>


Соответственно можно таким же образом синхронизировать по своему времени и таймер для всех клиентов.

Вы так и не дали ответа от куда берется та величина, по которой вы все пытаетесь найти метку. А именно определяя на какой границе или у какой границы находится ее значение, по условию можно определить нужное. Об этом условии (условиях) вы ни гу-гу.

Я писал как можно контролировать и запоминать последнюю метку клиента, и достаточно было бы по разности запомненной и вновь поступившей знать сколько "шагов периода" клиента не было, и нужно ли стартовать вновь или продолжать далее. Я об этом писал раньше.

А от вас только одно:

Чтобы выяснить, с какого времени счетчику начинать отчет ищем метку времени сколько еще осталось до окончания 3-х часового периода

А относительно чего и если осталось, то запускать новое или продолжать текущее, а по какому условию новое... ? Вы не описываете блок схему задачи, вы постоянно спрашиваете одно и тоже, как от 5 отнять 3.

Вы знаете, что время ваше должно быть кратно 3 часам, по этой величине всегда можно знать кратна ли метка и если нет, то какой остаток. А уж далее как вам надо. Нет в этом ничего сложно. А вот чего вы хотите, я не ведаю.

Все, более мне долго рассуждать некогда. Думайте.

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

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