Не работает отсчёт времени js + php

363
05 сентября 2017, 11:32

Есть следующий скрипт :

timeend= new Date(2017,08,4,2,48);

function time() {
    today = new Date();
    today = Math.floor((timeend-today)/1000);
    tsec=today%60; today=Math.floor(today/60); if(tsec<10)tsec=+'0'+tsec;
    tmin=today%60; today=Math.floor(today/60); if(tmin<10)tmin='0'+tmin;
    thour=today%24; today=Math.floor(today/24);
    timestr=today +" д. "+ thour+":"+tmin+":"+tsec+"";
    document.getElementById('timer').innerHTML=timestr;
   if(today != 0 || thour != 0 || tmin != 0 || tsec != 0 ){
   window.setTimeout("time()",1000);
   }
}
$(document).ready(time());

Но мне надо , сделать отсчёт учитывая время сервера , а не браузера. Вставил в New Date данные сервера. :

timeend= new Date(2017,08,4,2,48);

function time() {
    today = new Date(<?php Print(date('Y')) ?>,<?php Print(date('m')) ?>-1,<?php Print(date('d')) ?>,<?php Print(date('H')) ?>,<?php Print(date('i')) ?>);
    today = Math.floor((timeend-today)/1000);
    tsec=today%60; today=Math.floor(today/60); if(tsec<10)tsec=+'0'+tsec;
    tmin=today%60; today=Math.floor(today/60); if(tmin<10)tmin='0'+tmin;
    thour=today%24; today=Math.floor(today/24);
    timestr=today +" д. "+ thour+":"+tmin+":"+tsec+"";
    document.getElementById('timer').innerHTML=timestr;
   if(today != 0 || thour != 0 || tmin != 0 || tsec != 0 ){
   window.setTimeout("time()",1000);
   }
}
$(document).ready(time());

На выходе получаю в обоих случаях объекты , но всё равно не работает.

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

Answer 1

Проблема в том, что new Date() возвращает объект, содержащий местное время браузера. Чтобы такого не случилось, надо внести в создаваемый объект разницу между временем сервера и клиента (увы, точность будет хромать из-за немгновенной передачи кода на клиент, и ещё надо убедиться, что кеширование выключено, или время будет уезжать).

Ещё могут быть проблемы с часовыми поясами.

Этот код будет брать время сервера (не уверен, что часовые пояса будут считаться правильно)

<script type="text/javascript" src="http://code.jquery.com/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
    var serverDateOffset = (new Date()).getTime() - <?=time()?>000;
    var timeend = new Date(2017, 8, 6, 2, 48);
    function time() {
        var today = new Date((new Date()).getTime() - serverDateOffset);
        today = Math.floor((timeend - today) / 1000);
        var tsec = today % 60;
        today = Math.floor(today / 60);
        if (tsec < 10) tsec = +'0' + tsec;
        var tmin = today % 60;
        today = Math.floor(today / 60);
        if (tmin < 10) tmin = '0' + tmin;
        var thour = today % 24;
        today = Math.floor(today / 24);
        var timestr = today + " д. " + thour + ":" + tmin + ":" + tsec + "";
        document.getElementById('timer').innerHTML = timestr;
        if (today != 0 || thour != 0 || tmin != 0 || tsec != 0) {
            window.setTimeout(time, 1000);
        }
    }
    $(document).ready(time);
</script>
<div id="timer"></div>
Answer 2

Не забыть подключить jquerry

<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>

Переменная загрузки страницы в php. Если нужен начальный отсчет, то можно ввести нули. в php epoch идет 7-значный, в js 10 знаков.

<?php
    $time = $_SERVER['REQUEST_TIME'];
?>

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

<span id="time_from_js"><?php echo 'GMT '.gmdate('M:d, H:i', $time); ?></span>

Функция js, которая переводит timestamp в читабельный вид и заменяет элемент html на локальное время браузера.

        <script>
        $(document).ready(function func(timestamp) {
        epoch = <?php echo json_encode($time); ?>;
        var d = new Date(epoch * 1000),
            yyyy = d.getFullYear(),
            mm = ('0' + (d.getMonth() + 1)).slice(-2),//вставлять ли 0 перед числом
            dd = ('0' + d.getDate()).slice(-2),
            hh = ('0' + d.getHours()).slice(-2),
            h = hh,
            min = ('0' + d.getMinutes()).slice(-2),
            sc = (d.getSeconds()), 
            ampm = 'AM',
            time;
    switch (mm)//на случай, если нужны месяцы в буквах..
        {
            case '01': mm = 'Jan';break;
            case '02': mm = 'Feb';break;
            case '03': mm = 'Mar';break;
            case '04': mm = 'Apr';break;
            case '05': mm = 'May';break;
            case '06': mm = 'Jun';break;
            case '07': mm = 'Jul';break;
            case '08': mm = 'Aug';break;
            case '09': mm = 'Sep';break;
            case '10': mm = 'Oct';break;
            case '11': mm = 'Nov';break;
            case '12': mm = 'Dec';break;
            default:;
        };//end switch  
        if (hh > 12) { //формат 12 или 24
            h = hh - 12;
            ampm = 'PM';
        } else if (hh === 12) {
            h = 12;
            ampm = 'PM';
        } else if (hh == 0) {
            h = 12;
        }
    time = mm + ', ' + dd + ', ' + hh + ':' + min + ':' + sc;//формат вывода
    document.getElementById("time_from_js").innerHTML = time;
});
</script>

Получаем время отправления запроса php в локальном времени пользователя.

Answer 3

Попробуйте так:

function time(endtime) {
    var date = new Date(),
        newdate = new Date(endtime),
        time = (newdate.getTime() - date.getTime());
        //дальше рассчет по дням, часам, минутам, секундам и т.д.
}

ОБращаться к функции так:

time('<?=time()?>');
READ ALSO
вывести переменные из базы через ajax

вывести переменные из базы через ajax

Есть примерно такой кодВ php-обработчике идет запрос в БД: если такая запись уже есть, то echo 'no' и alert, что такой чек уже зарегистрирован

290
Изменение ссылки

Изменение ссылки

Здравствуйте! Есть ссылка, где адрес получаем из бд:

185
Как реализовывается вид товара?

Как реализовывается вид товара?

Привет ребята как в yii2 реализовывается вид товара плитка, таблица и список, как правильно сформировать ссылку

201
PayPal Sandbox проблема при оплате с аккаунта buyer

PayPal Sandbox проблема при оплате с аккаунта buyer

Пытаюсь интегрировать PayPal с сайтом на Yii2Использую Sandbox для тестирования

170