这个问题太宽泛了,比如问“我如何开发一款游戏?比如,一个平台,有僵尸。”,但我会尽力回答。
建议:有些术语如果您不知道它们的含义,则必须在 Google 上查找。
答案很简单:通过连接到该服务器并检索信息。
你手上有哪些连接服务器的选项?
我可以考虑 3 个选项:
- 通过执行 AJAX 请求。
- 通过 WebSocket 连接。
- 包括来自服务器的 JavaScript 文件。
在所有 3 种方法中,服务器必须准备好为您提供日期时间信息,因此您要么找到提供获取其日期时间信息的方法的第三方服务,要么准备自己的服务器。
通过 AJAX 请求
这种方式是典型的。您向服务器发出 AJAX 请求并获取信息。您有两种获取信息的方式:直接返回时间数据或将时间数据附加到标题然后读取标题。
为此,服务器需要为您的域启用 CORS。如果您不是服务器的所有者,这是一项艰巨的任务。
通过 WebSockets 连接
应用与 AJAX 相同的原理。您需要一个启用了 WebSockets 的服务器。所有现代浏览器都有一种称为 WebSocket 的新型套接字,它允许它们连接到支持 WebSocket 的服务器并传输实时数据。
使用此方法,您将连接到服务器并直接接收信息或发送消息以接收信息。这完全取决于服务器实现。
此方法不需要 CORS。
包含来自服务器的 JavaScript 文件
这个方法很奇怪,但是可以。您附加一个 <script> 标记来加载位于服务器中的文件,文件内容是包含您想要的信息的变量。
得到信息后怎么办
假设您完成了 3 种方法中的任何一种,并且您掌握了相关信息。该信息可以是日期时间 ISO 字符串或纪元数。这些是最简单的,因为您可以将它们直接传递给 Date 构造函数。
您不能执行new Date() 并认为差异将被自动计算。 new Date() 总是返回本地日期,没有原生的方法来“修正”它,所以你必须创建自己的修正方法,所以在你得到信息后,你需要提取时差。
这是一个简单的获取本地纪元时间,服务器纪元时间和减法,如下所示:
var servertimeinfo = "2015-06-21T22:44:06.296Z"; // This is the server time info. Can be an epoch or a ISO string, like I mentioned above.
var servertime = new Date(servertime).getTime(); // With this you convert the server time to an epoch, so you always work in milliseconds
var mytime = Date.now(); // With this you get the local computer epoch in milliseconds
var diff = mytime - servertime; // And now you have the difference.
有了这个差异,您可以在每次需要时重新计算Date 对象。如何?您创建一个看起来像这样的函数:
function newServerDate() {
return new Date(Date.now() - diff);
}
所以每次您需要日期时,您必须调用var date = newServerDate();,而不是调用var date = new Date();。
所以这就像做一个new Date(),但每次都会减去服务器时间差。大多数库实际上都是这样做的,但是由于 JavaScript 没有本地方法,因此您必须自己实现它。