Таймер на javascript

Рейтинг: 1Ответов: 1Опубликовано: 11.06.2011

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

function clock_update (ss)
{
    date1 = new Date ();//1307453901000
    date2 = new Date (ss);

    diff  = new Date();
    diff.setTime (date1.getTime() - ss*1000);
    timediff = diff.getTime();
    years = Math.floor (timediff / (1000 * 60 * 60 * 24 * 365));
    timediff -= years * (1000 * 60 * 60 * 24 * 365);
    months = Math.floor (timediff / (1000 * 60 * 60 * 24 * 30));
    timediff -= months * (1000 * 60 * 60 * 24 * 30);
    weeks = Math.floor (timediff / (1000 * 60 * 60 * 24 * 7));
    days = Math.floor(timediff / (1000 * 60 * 60 * 24));
    timediff -= days * (1000 * 60 * 60 * 24);
    hours = Math.floor(timediff / (1000 * 60 * 60)); 
    timediff -= hours * (1000 * 60 * 60);
    minutes = Math.floor(timediff / (1000 * 60)); 
    timediff -= minutes * (1000 * 60);
    seconds = Math.floor(timediff / 1000);
    timediff -= seconds * 1000;

    if (hours < 10)  hours = '0' + hours;
    if (minutes < 10)  minutes = '0' + minutes;
    if (seconds < 10)  seconds = '0' + seconds;

    document.getElementById ('times').innerHTML = '';

    if (years>0) document.getElementById ('times').innerHTML += years + 'г. ';
    if (months>0) document.getElementById ('times').innerHTML += months + ' м. ';
    if (days>0) document.getElementById ('times').innerHTML += days + ' д.<br>';

    document.getElementById ('times').innerHTML += hours + ':' + minutes + ':' + seconds + '';
}

Пожалуйста, подскажите ошибку. Нужно, чтобы второй файл на JavaScript, показывал в точности то же время, что и файл ajax/doit.php

Добавлено.

Вот два примера с двумя разными профайлами (пользователями, запустившими таймер):

1) Таймер на сайте (он работает на ajax/doit.php) показывает время:
3г.2м.21д.
00:11:03

таймер на Денвере с кодом на JavaScript (второй код в моем вопросе):
3г.2м.21д
23:11:03
Разница 23 часа

2) Таймер на сайте:
1г.10м.28д
00.55.17

таймер на Денвере:
1г.11м.2д
00.55.17

В первом случае таймер на JavaScript (на Денвере) убегает на 23 часа, во втором - на 4 суток (если в мес 30 дней). Если на Денвере убрать jquery.js (в нем вписан код выведения таймера JavaScript) и поставить jquery.js с путем, указывающим на ajax/doit.php и саму эту папку поставить, то время будет абсолютно совпадать с тем, что на сайте в обоих профайлах.

Ответы

▲ 4

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

date1 = new Date ();

Нужно либо сохранять на сервере время клиента, либо передавать в JavaScript с сервера и время запуска, и текущее время.