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