|
|
|
| Всем добрый день,
столкнулся с проблемой при реализации скрипта обратный отсчет.
Чтобы отображать отсчет каждые 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а нет. | |
|
|
|
|
|
|
|
для: tima2010
(07.10.2013 в 13:59)
| | Получить метку времени через некий интервал несложно и гораздо проще, чем вы делаете.
Но что значит запускать таймер через каждые 24 часа? Ведь для этого ваш скрипт должен быть запущен постоянно чтобы контролировать текущее время. А значит нужно делать примерно так. | |
|
|
|
|
|
|
|
для: confirm
(07.10.2013 в 20:05)
| | Извиняюсь, не верно выразился, скрипт просто напросто отображает цифры от определенной точки отсчета используя JS. (таймер обратного отсчета jquery-countdown plugin - v0.2)
При помощи PHP указываю сколько еще осталось до Х.
Нужно чтобы таймер начинал отсчет заново каждые 3 часа.
>> Получить метку времени через некий интервал несложно и гораздо проще, чем вы делаете.
Пожалуйста, расскажите подробнее. Спасибо. | |
|
|
|
|
|
|
|
для: 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 у него наблюдаются глюки. | |
|
|
|
|
 37.9 Кб |
|
|
для: confirm
(07.10.2013 в 20:47)
| | Да, при помощи PHP я и хочу задать точку отсчета. Причем каждые 3 часа эта точка отсчета становится снова 2.59
прикрепил файл.
Как я себе изначально представлял решение:
Делим 24 часа на 8 частей, получаем по 3 часа в 1 части
Счетчик должен начинать новый отсчет каждые 3 часа.
Узнаем текущее время.. и тут застрял ))
Не могу сообразить как формула должна работать
Нужно узнать в какую часть входит текущее время (1-8)
(24ч / 8) - (?) = начало счетчика | |
|
|
|
|
|
|
|
для: 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 меток через интервал указанный, то я же писал как. Но вроде бы не это главное. Как вы будет знать, что надо именно от какой-то метки получить интервал, если ваш скрипт не запущен постоянно, а запрос его произойдет во время совсем не синхронное с вашими метками?
Я вам написал как я представляю себе контроль времени Х, и этот контроль происходит не в реальном масштабе времени, а учитывает время нахождения пользователя в онлайн. И только в периоды этого времени можно принять решение - проскочил ли на данный момент пользователь время Х или нет, нужно ли устанавливать ему новый старт и с какого времени. То есть все сводится к проверке на условия, ибо синхронизировать действия пользователя и работу ваших часов нельзя.
Случаем не этот плагин используете? Если да, то читайте тут, глючный он. | |
|
|
|
|
|
|
|
для: 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);
}
}
|
| |
|
|
|
|
|
|
|
для: tima2010
(08.10.2013 в 09:17)
| | Я вам про Фому, а вы все про Ерему.
Я смотрю на вашу математику и не понимаю чего вы вытворяете, и чего вам надо. Вы бы уж лучше словами описали задачу, и не как 4 х 5, и почему получает 21 при этом, а суть и условия решаемой задачи.
Время, это просто временная метка, у которой есть "условное начало" отсчета. Зная это начало и добавив к нему некое смещение, и будем находится в нужной нам временной метке. А зная некий период, и зная сколько шагов с этим периодом нужно сделать, можно всегда переместиться во временную метку на S шагов с периодом P. Держать для этого в уме или записывать на клочке бумаги промежуточные временные метки совсем не обязательно, их легко получить. А также легко узнать входит ли некая временная метка в диапазон между двумя крайними или равна ли временной метке шага N с периодом P.
Ваша математика мне не понятна. Например, "Который сейчас час", это не
date('h', time() + 4*60*60)
а
date('h')
Зачем смещение в 4 часа? Не зная чего вы там в уме держите, и ни слова не говорите чего же все таки по сути вы решаете, хотя я уже дважды писал что я представляю себе, я вам ничего конкретного по вашей голой математике сказать не могу. | |
|
|
|
|
|
|
|
для: 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
... итд. | |
|
|
|
|
|
|
|
для: 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 часам, по этой величине всегда можно знать кратна ли метка и если нет, то какой остаток. А уж далее как вам надо. Нет в этом ничего сложно. А вот чего вы хотите, я не ведаю.
Все, более мне долго рассуждать некогда. Думайте. | |
|
|
|
|