показывать время сервера, включая смещение часового пояса

0

У меня есть некоторые трудности, показывающие фактическое время сервера с использованием php и js.
на стороне сервера у меня следующий код php:

$date = new DateTime();
echo $date->getTimestamp();

на стороне клиента, если есть следующий код js, который изменяет содержимое div для отображения текущего времени:

flag = true;
timer = '';


function clock()
{
        if ( flag ) {
            xmlhttp = new XMLHttpRequest();
            xmlhttp.open("GET", "backend/time_backend.php?action=serverTime", false);
            xmlhttp.send();

            var stamp = xmlhttp.responseText;


            timer = stamp*1000;
        }
        var d = new Date(timer);

        var hours = d.getHours();
        var minutes = d.getMinutes();
        var seconds = d.getSeconds();

        //hours = hours % 12;
        //hours = hours ? hours : 12; // the hour 0' should be 12'
        minutes = minutes < 10 ? '0'+minutes : minutes;
        seconds = seconds < 10 ? '0'+seconds : seconds;
        var strTime = hours + ':' + minutes + ':' + seconds;
        document.getElementById("clock").innerHTML= strTime ;

        flag = false;
        timer = timer + 1000;
}

window.onload = function() {
    setInterval(clock, 1000);
};

это работает до тех пор, пока часовой пояс сервера и моего сервера одинаковый. но как только я изменяю часовой пояс на сервере, он больше не работает. он все равно покажет время моего локального клиента, хотя date команды bash на сервере показывает время в правом смещении.

Как это исправить? мне действительно нужно показать сервер-местное время.

  • 0
    Это помогает вообще? stackoverflow.com/a/6621656/989920 Я не думаю, что проблема с JS, так как это только преобразование метки времени, предоставленной вашим сервером. Проблема, вероятно, time_backend.php с кодом, предоставляющим метку времени в time_backend.php .
Теги:
time

3 ответа

1
Лучший ответ

Вы отправляете в timestamp unix из PHP, вероятно, должны использовать

echo date("Y-m-d H:i:s", time());

если вы хотите использовать строку для создания объекта даты с помощью JS.

Ваш JS-код должен быть

function clock()
{
    if ( flag ) {
        xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", "backend/time_backend.php?action=serverTime", false);
        xmlhttp.send();

        var stamp = xmlhttp.responseText;

        var timer = new Date(stamp);
    }
    var d = new Date(timer);

    var hours = d.getHours();
    var minutes = d.getMinutes();
    var seconds = d.getSeconds();

    //hours = hours % 12;
    //hours = hours ? hours : 12; // the hour 0' should be 12'
    minutes = minutes < 10 ? '0'+minutes : minutes;
    seconds = seconds < 10 ? '0'+seconds : seconds;
    var strTime = hours + ':' + minutes + ':' + seconds;
    document.getElementById("clock").innerHTML= strTime ;

    flag = false;
    timer = new Date(timer.getTime() + 1000);
}
  • 0
    Нет, все еще показывает клиентское местное время ... :(
  • 0
    Вам не нужно делать "timer = stamp * 1000;" больше, поскольку время приходит в ожидаемом формате.
Показать ещё 3 комментария
1

Вы можете использовать дату в формате ISO 8601.

$date = date("c", time());

Дай вам один.

ISO 8601 Элементы данных и форматы обмена - Обмен информацией. Представление дат и времени является международным стандартом, охватывающим обмен данными по дате и времени. Он был выпущен Международной организацией по стандартизации (ИСО) и был впервые опубликован в 1988 году. Целью настоящего стандарта является предоставление однозначного и четко определенного метода представления дат и времени во избежание неправильной интерпретации числовых представлений дат и раз, особенно когда данные передаются между странами с различными соглашениями для написания числовых дат и времени.

Затем вы можете сделать Date.parse(), в котором будет возвращена метка времени;), затем продолжайте, как если бы вы получили временную метку.

  • 0
    к сожалению, js по-прежнему показывает местное время клиента. console.log(stamp) напечатано 2015-03-26T20:44:16+02:00 (часовой пояс 19:44:16 ), и браузер показал мне 19:44:16 (мое местное время, часовой пояс Берлина).
  • 0
    Хорошо, я вижу вашу проблему :) достаточно болезненно, javascript всегда будет пытаться преобразовать его в ваше местное время. Так что вы можете сделать, чтобы облегчить свою боль. Поскольку создание new Date(stamp) напрямую также приводит к конвертации в ваш местный часовой пояс. Что вы отслеживаете смещение по сравнению с вашим часовым поясом. Затем вам нужно будет добавить или вычесть это из отметки времени :( Если я получу его, а вы пытаетесь отобразить время, которое находится на сервере, а не на клиенте. Верно? :)
Показать ещё 1 комментарий
0

Date::getTimestamp всегда возвращает Date::getTimestamp времени Unix. Временная метка Unix не хранит информацию о часовом поясе.

Решение состоит в том, чтобы создать объект JavaScript Date из даты, заданной сервером.

Примечание. Время не будет синхронизироваться, когда сервер или клиент изменят часовые пояса (т.е. DST). Если избежать запросов на бэкэнд, более точное решение будет заключаться в использовании библиотеки часовых поясов в JavaScript (например, timezone.js).

PHP:

$date = new DateTime;

echo json_encode(array(
    'year' => (int) $date->format('Y'),
    'month' => (int) $date->format('m'),
    'day' => (int) $date->format('j'),
    'hours' => (int) $date->format('H'),
    'minutes' => (int) $date->format('i'),
    'seconds' => (int) $date->format('s'),
));

JavaScript:

var date = null;

function updateTime() {
    if (!date) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", "backend/time_backend.php?action=serverTime", false);
        xmlhttp.send();

        var j = JSON.parse(xmlhttp.responseText);
        date = new Date(
            j['year'], j['month'],
            j['day'], j['hours'],
            j['minutes'], j['seconds']
        );

        return;
    }

    // Increment time by 1 second
    date.setTime(date.getTime() + 1000);
}

function clock() {
    updateTime();

    var hours = date.getHours();
    var minutes = date.getMinutes();
    var seconds = date.getSeconds();

    hours = hours % 12;
    hours = hours ? hours : 12; // the hour 0' should be 12'
    minutes = minutes < 10 ? '0'+minutes : minutes;
    seconds = seconds < 10 ? '0'+seconds : seconds;
    var strTime = hours + ':' + minutes + ':' + seconds;
    document.getElementById('clock').innerHTML = strTime;
}

window.onload = function() {
    setInterval(clock, 1000);
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню