获取当前的 GMT 世界时间

IT技术 javascript
2021-01-21 01:18:47

我怎样才能获得当前时间?(在 JavaScript 中)

不是您的计算机的时间,例如:

now = new Date;
now_string = addZero(now.getHours()) + ":" + addZero(now.getMinutes()) + ":" + addZero(now.getSeconds());

但真正准确的世界时间呢?

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

我从谷歌进行的所有搜索都返回(new Date).getHours().

编辑:

如果用户在他的计算机上有错误的时间,我想避免显示错误的时间。

6个回答

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

(下面的代码应该可以完美运行,只是测试了一下......)

function getTime(zone, success) {
    var url = 'http://json-time.appspot.com/time.json?tz=' + zone,
        ud = 'json' + (+new Date());
    window[ud]= function(o){
        success && success(new Date(o.datetime));
    };
    document.getElementsByTagName('head')[0].appendChild((function(){
        var s = document.createElement('script');
        s.type = 'text/javascript';
        s.src = url + '&callback=' + ud;
        return s;
    })());
}

getTime('GMT', function(time){
    // This is where you do whatever you want with the time:
    alert(time);
});
API 工作正常,但今晚它关闭了,因为它超过了 Google 当天的配额。免费 AppEngine 帐户的配额仅为每天 130 万个请求。
2021-03-18 01:18:47
现在给出 404 错误 Remote Address:74.125.200.141:80 Request URL:http://json-time.appspot.com/time.json?tz=GMT&callback=json1439373722068 Request Method:GET Status Code:404 Not Found
2021-03-19 01:18:47
JasonS,我再次为你加分 :)
2021-03-28 01:18:47
哇,这比我的答案简单得多。但缺点是您必须完全信任该站点,否则他们会在您的页面上运行任意代码。
2021-03-31 01:18:47
你是对的 Shiny 先生...我认为这个 API 非常值得信赖,它由 Google 托管并由 Simon Willison(共同创建 Django 的人)创建:)
2021-04-07 01:18:47

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

我会将您的网络服务器配置为使用 NTP 将其时钟与 GMT 同步,并让网络服务器通过向页面写入变量来告诉脚本它的时间。或者在您需要知道时间时将 XmlHttpRequest 和 XmlHttpRequest 返回到服务器。不利的一面是,由于所涉及的延迟,这将是不准确的:服务器确定时间,将其写入响应,响应通过网络传输,并且每当客户端的 cpu 给它一个时间片等时,javascript 就会执行。慢速链接如果页面很大,您可能会延迟几秒钟。您可以通过确定用户时钟与格林威治标准时间相差多远来节省一些时间,只需通过该偏移量调整所有时间计算。当然,如果用户'

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

编辑JimmyP 的回答非常简单且易于使用:使用 Javascript 添加一个<script>调用 url元素,例如http://json-time.appspot.com/time.json?tz=GMT. 这比您自己做要容易,因为 json-time.appspot.com 服务器用作 GMT 时间的来源,并以允许您解决同源策略的方式提供此数据。对于简单的网站,我建议这样做。但是它有一个主要缺点:json-time.appspot.com 站点可以在您用户的页面上执行任意代码。这意味着,如果该站点的运营商想要分析您的用户或劫持他们的数据,他们可以轻松完成。即使您信任运营商,您也需要相信他们没有被黑客入侵或入侵。对于商业站点或任何具有高可靠性问题的站点,我建议您自己托管时间解决方案。

编辑 2JimmyP 的回答有一条评论,表明 json-time 应用程序在它可以支持的请求数量方面有一些限制。这意味着如果您需要可靠性,您应该自己托管时间服务器。但是,在您的服务器上添加一个响应相同格式数据的页面应该很容易。基本上你的服务器需要一个查询,例如

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

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

@fmsf:由于您是菜鸟,所以最好使用 JimmyP 的回答。我的回答涉及在服务器上进行编程并提供代码示例并非易事。
2021-03-20 01:18:47
仅供参考,json-time 网站现已不存在。
2021-03-25 01:18:47
一个例子或教程链接会很棒,有了这个答案,你会得到这个问题的正确答案:)
2021-04-06 01:18:47
有用的 teory(不是开玩笑,也不是开玩笑):) 但我该怎么做呢?我 == javascript 中的菜鸟
2021-04-08 01:18:47

为什么不每页都发送时间?例如在 html 中的某处:

<span id="time" style="display:none;">
    2009-03-03T23:32:12
</span>

然后,您可以在站点加载并解释日期时运行 Javascript。这将减少网络必须做的工作量。您可以存储相应的本地时间,并在每次需要时计算偏移量。

我想时间会由带有 PHP 的服务器给出,不是吗?它真的很聪明。编辑:或者甚至更好,将它直接放在 JS 变量中,并减少处理延迟。
2021-03-19 01:18:47

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

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

Shiny 先生和 NewJames回答的一点补充

这是一个 PHP 脚本,您可以将其放置在自己的服务器上并使用它代替 json-time.appspot.com

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