显示服务器时间,包括时区偏移

show server time including timezone offset

本文关键字:包括时 服务器 时间 显示      更新时间:2023-09-26

我在使用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);
};

只要服务器和我的时区相同,这就可以工作。但一旦我在服务器上更改时区,它就不再工作了。它仍然会显示我的本地客户端时间,尽管服务器上的bash命令date以正确的偏移量显示时间。

我该怎么解决这个问题?我真的需要显示服务器的本地时间。

您正在从PHP发送unix时间戳可能正在使用

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);
}

您可以使用ISO 8601格式的日期。

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

会给你一个。

ISO 8601数据元素和交换格式——信息互换-日期和时间的表示是国际性的涵盖日期和时间相关数据交换的标准。是的由国际标准化组织(ISO)发布,以及于1988年首次出版。本标准旨在提供一种明确定义的日期表示方法和时间,以避免对数字表示的误解日期和时间,特别是当数据在具有不同书写数字日期和时间

然后,您可以执行Date.parse()操作,在该操作中将返回时间戳;)然后继续,就好像你收到了时间戳一样。

Date::getTimestamp始终返回Unix时间戳。Unix时间戳不存储时区信息。

解决方案是根据服务器提供的日期信息构建JavaScriptDate对象。

注意:当服务器或客户端更改时区(即夏令时)时,时间不会不同步。如果避免对后端的请求,一个更准确的解决方案是使用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);
};