Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaScript获取可靠的日期_Javascript_Jquery_Ajax_Date_Time - Fatal编程技术网

如何使用JavaScript获取可靠的日期

如何使用JavaScript获取可靠的日期,javascript,jquery,ajax,date,time,Javascript,Jquery,Ajax,Date,Time,上周我在工作中遇到了一个有趣的问题。我面临着使用JavaScript可靠地获取日期的必要性。我正在使用的现有代码使用new Date()获取当前日期和时间。但是,我发现我们的一些客户的系统时间/日期没有反映实际的时间/日期 好的解决方案: 这个问题的最佳解决方案是找出服务器端的日期,然后通过模板语言将其推到前端,或者在提交后在服务器端设置接收日期。不幸的是,这是不可能与我们的托管服务,因为没有真正的后端访问 工作解决办法: 在对这个问题研究了一段时间后,没有发现任何对我有用的方法,我想出了自己的

上周我在工作中遇到了一个有趣的问题。我面临着使用JavaScript可靠地获取日期的必要性。我正在使用的现有代码使用new Date()获取当前日期和时间。但是,我发现我们的一些客户的系统时间/日期没有反映实际的时间/日期

好的解决方案:

这个问题的最佳解决方案是找出服务器端的日期,然后通过模板语言将其推到前端,或者在提交后在服务器端设置接收日期。不幸的是,这是不可能与我们的托管服务,因为没有真正的后端访问

工作解决办法:

在对这个问题研究了一段时间后,没有发现任何对我有用的方法,我想出了自己的解决方案,效果相当不错。 其思想是向一些已知的安全站点发送一个ajax请求,该站点返回很少的数据(甚至返回一个404错误,我们将在后面看到)。然后,我们可以使用这个responses头来获取准确的日期(假设服务器的日期/时间是正确的)。 下面是它的样子:

$.ajax({
url:’www.google.com’,
type:’get’,
success(data, status, xhr){
    return xhr.getResponseHeader(‘date’);
}
});
我们还可以轻松添加一个error函数,该函数在请求导致错误时仍然返回日期(如我前面提到的404错误):

由于此函数喜欢在ajax请求返回之前返回,因此最安全的做法是返回回调,以便函数等待ajax调用完成。 最终的解决方案如下所示:

Function getRealTime(callback){
$.ajax({
url:’www.google.com’,
type:’head’,
success(data, status, xhr){
    return callback(new Date(xhr.getResponseHeader(‘date’)));
},
error:function(xhr, status, error){
    return callback(new Date(xhr.getResponseHeader(‘date’)));
}
});
}
您会注意到我将类型更改为“head”,这将只生成响应的标题,从而大大减少了响应大小。我还将返回类型更改为new Date(),这将确保函数返回日期对象而不是字符串,我更喜欢字符串

结论:


这是一个非常简单而且非常快速的方法来获得一个可靠的日期(如果你愿意的话,还有时间……时间会可靠到一两秒钟)。我在网上看到的所有建议都涉及到请求带有时钟的网页,然后解析超时,甚至为NIST服务器编写处理程序,以便像windows一样获得时间,这需要相当多的开发。只要您确保您使用的网页是可靠的(比如您自己域中的网页),并且确保请求不会失控并使服务器陷入困境(可以考虑指向一个域中不存在的网页,该网页会导致404错误),您就可以了。作为参考,我在自己的网页上使用一个页面的请求是1.5kb,超过200毫秒。不优化也不错。

优化的好方法是专门为此设置一个空页面。如果请求失控,您甚至可以为此专门设置一个单独的服务器。然而,如果你收到了足够多的请求,使你的服务器陷入困境,你就应该真正投资于重新编写你的站点,使用可以自动为你填写日期的模板

Function getRealTime(callback){
$.ajax({
url:’www.google.com’,
type:’head’,
success(data, status, xhr){
    return callback(new Date(xhr.getResponseHeader(‘date’)));
},
error:function(xhr, status, error){
    return callback(new Date(xhr.getResponseHeader(‘date’)));
}
});
}