Javascript 获取当前GMT世界时间

Javascript 获取当前GMT世界时间,javascript,Javascript,如何获取当前时间?(在JavaScript中) 与您的计算机使用时间不同的是: now = new Date; now_string = addZero(now.getHours()) + ":" + addZero(now.getMinutes()) + ":" + addZero(now.getSeconds()); 但真正准确的世界时间呢 我是否需要连接到服务器(很可能是的,哪一个?如何从中检索时间?) 我从google进行的所有搜索都返回(新日期).getHours() 编辑: 如果用

如何获取当前时间?(在JavaScript中)

与您的计算机使用时间不同的是:

now = new Date;
now_string = addZero(now.getHours()) + ":" + addZero(now.getMinutes()) + ":" + addZero(now.getSeconds());
但真正准确的世界时间呢

我是否需要连接到服务器(很可能是的,哪一个?如何从中检索时间?)

我从google进行的所有搜索都返回
(新日期).getHours()

编辑:

如果用户的计算机中有错误的时间,我希望避免显示错误的时间。

您可以使用获取本地日期和GMT日期之间的偏移量,然后进行计算。但这只能和用户的时钟一样精确


如果你想要一个准确的时间,你应该连接到。由于,您不能使用JS向其他服务器发出请求,而不是您的服务器。我建议您创建一个连接到NTP服务器的服务器端脚本(用PHP或任何您想要的语言),并返回准确的日期。然后,使用AJAX请求读取此时间。

首先,要获得所需的准确GMT时间,需要一个您信任的源。这意味着某个服务器在某处。Javascript通常只能进行HTTP调用,并且只能对承载相关页面的服务器进行调用(同源策略)。因此,该服务器必须是GMT时间的源

我会将您的Web服务器配置为使用NTP将其时钟与GMT同步,并让Web服务器通过向页面写入变量来告诉脚本现在是什么时间。或者在需要知道时间时将make和XmlHttpRequest返回到服务器。缺点是,由于所涉及的延迟,这将是不准确的:服务器确定时间,将其写入响应,响应通过网络传输,并且每当客户端的cpu给javascript一个时间片时,javascript就会执行,等等。在慢速链接上,如果页面很大,则可能会有几秒钟的延迟。您可以通过确定用户的时钟离GMT的距离来节省一些时间,只需根据该偏移量调整所有时间计算。当然,如果用户的时钟慢或快(不仅仅是晚或早),或者用户在电脑上更改了时间,那么您的偏移量就会被破坏

还要记住,客户机可以更改数据,所以不要相信他们发送给您的任何时间戳

编辑: 非常简单且易于使用:使用Javascript添加一个
元素,该元素调用url,如。这比自己做要容易,因为json-time.appspot.com服务器是GMT时间的来源,并以一种让您可以围绕同一来源策略工作的方式提供这些数据。对于简单的站点,我建议这样做。但是它有一个主要缺点:json-time.appspot.com站点可以在用户页面上执行任意代码。这意味着,如果该网站的运营商想要分析你的用户,或者劫持他们的数据,他们可以做得很简单。即使你信任运营商,你也需要相信他们没有被黑客攻击或受到危害。对于一个商业网站或任何具有高可靠性问题的网站,我建议您自己托管时间解决方案

编辑2: 有一条评论指出,json时间应用程序在支持的请求数量方面存在一些限制。这意味着如果您需要可靠性,您应该自己托管时间服务器。但是,在您的服务器上添加一个响应相同数据格式的页面应该很容易。基本上,您的服务器接受如下查询

http://json-time.appspot.com/time.json?tz=America/Chicago&callback=foo
并返回一个字符串,如

foo({
 "tz": "America\/Chicago", 
 "hour": 15, 
 "datetime": "Thu, 09 Apr 2009 15:07:01 -0500", 
 "second": 1, 
 "error": false, 
 "minute": 7
})

注意包装JSON对象的
foo()
;这对应于查询中的callback=foo。这意味着当脚本加载到页面中时,它将调用您的foo函数,该函数可以随时间做任何它想做的事情。本例的服务器端编程是一个单独的问题。

您可以使用JSON[p]并访问时间API:

(下面的代码应该工作得很好,只是测试了一下而已…)

如前所述,您需要一个时间正确的服务器。它可以是站点所在的服务器,也可以是以您可以读取的格式发送正确时间的其他服务器

如果您希望在页面上多次使用日期,间隔一秒或几秒,您可能不希望每次都从服务器获取时间,而是缓存差异并使用客户端时钟。如果是这种情况,以下是众多解决方案之一:

var MyDate = new function() {
    this.offset = 0;
    this.calibrate = function (UTC_msec) {
        //Ignore if not a finite number
        if (!isFinite(UTC_msec)) return;

        // Calculate the difference between client and provided time
        this.offset = UTC_msec - new Date().valueOf();

        //If the difference is less than 60 sec, use the clients clock as is.
        if (Math.abs(this.offset) < 60000) this.offset = 0;
    }
    this.now = function () {
        var time = new Date();
        time.setTime(this.offset + time.getTime());
        return time;
    }
}();
其中数字是自1970年1月1日以来的当前时间(毫秒)。您还可以使用您最喜欢的AJAX框架,让它调用上面的函数。或者您可以使用建议的解决方案。我已经重写了JimmyPs解决方案以包含在我的解决方案中。只需在上述函数中复制并粘贴以下内容:

    this.calibrate_json = function (data) {
        if (typeof data === "object") {
            this.calibrate (new Date(data.datetime).valueOf() );
        } else {
            var script = document.createElement("script");
            script.type="text/javascript";
            script.src=(data||"http://json-time.appspot.com/time.json?tz=UTC") +
                "&callback=MyDate.calibrate_json";
            document.getElementsByTagName('head')[0].appendChild(script);
        }
    }
    this.calibrate_json(); //request calibration with json
请注意,如果从MyDate更改函数名,则必须在script.src行的this.calibrate_json中更新回调

说明:

Mydate.offset是服务器时间和客户端时钟之间的当前偏移量(以毫秒为单位)

Mydate.calibrate(x);是一个设置新偏移的函数。它期望输入是自1970年1月1日以来的当前时间(毫秒)。如果服务器和客户端时钟之间的差异小于60秒,则将使用客户端时钟

Mydate.now()是一个函数,用于返回具有当前校准时间的日期对象

calibrate_json(data)是一个函数,它要么获取返回datetime回复的资源的url,要么获取具有当前时间的对象(用作回调)。如果没有提供任何内容,它将使用默认url获取时间。url中必须有问号“?”

如何每秒使用当前时间更新元素的简单示例:

setInterval(
    function () {
        var element = document.getElementById("time");
        if (!element) return;
        function lz(v) {
            return v < 10 ? "0" + v : v;
        }
        var time = MyDate.now();
        element.innerHTML = time.getFullYear() + "-" +
            lz(time.getMonth() + 1) + "-" +
            lz(time.getDate()) + " " +
            lz(time.getHours()) + ":" +
            lz(time.getMinutes()) + ":" +
            lz(time.getSeconds())
        ;
},1000);
setInterval(
函数(){
var元素=document.getElementById(“时间”);
如果(!元素)返回;
函数lz(v){
返回电压<10?“0”+v:v;
}
var time=MyDate.now();
element.innerHTML=time.getFull
    this.calibrate_json = function (data) {
        if (typeof data === "object") {
            this.calibrate (new Date(data.datetime).valueOf() );
        } else {
            var script = document.createElement("script");
            script.type="text/javascript";
            script.src=(data||"http://json-time.appspot.com/time.json?tz=UTC") +
                "&callback=MyDate.calibrate_json";
            document.getElementsByTagName('head')[0].appendChild(script);
        }
    }
    this.calibrate_json(); //request calibration with json
setInterval(
    function () {
        var element = document.getElementById("time");
        if (!element) return;
        function lz(v) {
            return v < 10 ? "0" + v : v;
        }
        var time = MyDate.now();
        element.innerHTML = time.getFullYear() + "-" +
            lz(time.getMonth() + 1) + "-" +
            lz(time.getDate()) + " " +
            lz(time.getHours()) + ":" +
            lz(time.getMinutes()) + ":" +
            lz(time.getSeconds())
        ;
},1000);
<span id="time" style="display:none;">
    2009-03-03T23:32:12
</span>
<?php
$json = file_get_contents( "http://json-time.appspot.com/time.json?tz=GMT" );
$obj = json_decode($json);
$timenow= $obj->{'datetime'};
$hournow= $obj->{'hour'}; 
$minutenow= $obj->{'minute'}; 
$secondnow= $obj->{'second'}; 
?>
<?php
header('Content-Type: application/json');
header("Expires: Tue, 01 Jan 1990 00:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

$error = "false";
$tz = $_GET['tz'];

if ( !in_array($tz, DateTimeZone::listIdentifiers())) {
   $error = 'invalid time zone';
   $tz = 'UTC';
}

date_default_timezone_set($tz);

?>
<?php echo htmlspecialchars($_GET['callback'], ENT_QUOTES, 'UTF-8' ); ?>({
 "tz": "<?php echo $tz ?>",
 "hour": <?php echo date('G'); ?>,
 "datetime": "<?php echo date(DATE_RFC2822); ?>",
 "second": <?php echo intval(date('s')); ?>,
 "error": "<?php echo $error; ?>",
 "minute": <?php echo intval(date('i')); ?>
})
function getServerTime()
{
    var req = new XMLHttpRequest();
    req.open('GET', document.location, false);
    req.send(null);
    return new Date(req.getResponseHeader("Date"));
}
req.open('GET', "/time?r=" + Math.floor(Math.random()*10000000), false);
 $.getJSON("http://www.timeapi.org/utc/now.json?callback=?",function(json){
       //console.log(json)
       alert(json.dateString);
 });
  September 02, 2016 09:59:42 GMT+0100
  new Date(json.dateString)
   $.getJSON("http://www.timeapi.org/utc/now.json?callback=?",function(json){

         var now = new Date(json.dateString);
         var hours = now.toLocaleTimeString();

         alert(hours)

    });
import datetime
import json

def lambda_handler(event, context):
   dt = datetime.datetime.utcnow()

   return {
      'statusCode': 200,
      'body': json.dumps({
      'iso_time': dt.strftime('%Y-%m-%dT%H:%M:%SZ')
   })
}