上周我在工作中遇到了一个有趣的问题。我面临着使用JavaScript可靠地获取日期的必要性。我正在使用的现有代码使用新的Date()来获取当前的日期和时间。但是,我发现我们的一些客户的系统时间/日期并未反映实际的时间/日期。
良好的污染:
解决此问题的最佳方法是找出它在服务器端的日期,并通过模板语言将其推送到前端,或者只是在提交后在服务器端设置提取日期。不幸的是,由于没有真正的后端访问权限,我们的托管服务无法做到这一点。
工作解决方案:
在研究了这个问题一段时间之后,找不到任何对我有用的东西,我提出了自己的解决方案,并且工作得很好。 我们的想法是向一些已知的安全站点发送一个ajax请求,该站点返回的数据非常少(甚至会返回404错误,我们稍后会看到)。然后我们可以使用此响应标头来获取准确的日期(假设服务器的日期/时间是正确的)。 这是看起来像:
$.ajax({
url:’www.google.com’,
type:’get’,
success(data, status, xhr){
return xhr.getResponseHeader(‘date’);
}
});
我们还可以轻松添加一个错误函数,如果请求导致错误仍然返回日期(如我前面提到的404错误):
...error:function(xhr, status, error){return xhr.getResponseHeader(‘date’); }
由于此函数喜欢在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”,这将只导致响应的标题,从而减少响应大小。我还将返回类型更改为新的Date(),这将确保函数返回Date对象而不是字符串,我更喜欢。
结论:
这是获得可靠日期的一种非常简单且非常快速的方式(如果你愿意,那么时间......时间可靠到一两秒)。我在网上看到的所有建议都谈到了请求带有时钟的网页然后解析超时,甚至为NIST服务器编写处理程序以获得像windows一样的时间,这需要相当多的开发。只要您确保使用可靠的网页(如您自己域中的页面),并确保请求不会失控并使服务器陷入困境(可能会考虑指向一个页面,在强制404错误的域上不存在),你应该没问题。作为参考,我在我自己的网页上使用页面的请求是超过200毫秒的1.5kb。没有优化也不错。
答案 0 :(得分:0)
优化此方法的一个好方法是专门为此设置一个空的页面。如果请求失控,您甚至可以专门为此目的设置一个单独的服务器。但是,如果您收到足够的请求来阻止服务器,那么您应该投入重新编写网站以使用可以自动填充日期的模板。