js获取服务器时间(autojs时间同步)

牙叔教程 简单易学autojs版本8.7.7-0目标手机和服务器时间尽可能一致各个时间的关系手机发送请求的时刻a + 网络从手机到服务器的时长b = 服务器接收到请求的时刻c 服务器发送响应的时刻d + 网络从服务器到手机的时间e = 手机收到响应的时刻fa + b = c
d + e = f服务器处理速度较快, 可以认为 服务器接收到请求的时刻c=服务器发送响应的时刻d服务器处理速度较快, 可以认为 网络从手机到服务器的时长b=网络从服务器到手机的时间ec === d
b === e由 2和3 推导a + b = c
d(c) + e(b) = f

a + b = c
c + b = f

a + b + c + b = c + f
a + 2b = f

已知条件
手机发送请求的时刻a
手机收到响应的时刻f

可以求出网络从手机到服务器的时长b

网络从手机到服务器的时长b = (手机收到响应的时刻f – 手机发送请求的时刻a)/2
b = (f – a) / 2服务器时刻 = 手机时刻 + 网络从手机到服务器的时长b 手机时刻是知道的new Date().getTime()网络从手机到服务器的时长也是知道的第4步可以求解, 获取网络从手机到服务器的时长服务器时刻也就可以计算出来了 到这里就完了吗?图样图森破手机时间的误差手机一般默认设置 使用网络提供的时间这个时间和服务器的时间一定是有误差的我们还要把这个误差考虑进去那么, 这个误差怎么算呢当手机向服务器查询一次当前时间,会产生一个手机时刻A服务器会返回一个服务器时间服务器时间 – 网络从手机到服务器的时长 = 手机时刻B(以服务器为标准)手机时间误差 = 手机时刻B – 手机时刻A最终推导手机时间误差 = 手机时刻B – 手机时刻A
服务器时刻 = 手机时刻 + 网络从手机到服务器的时长b

服务器时刻 = 手机发送请求的时刻a + 手机时间误差 + 网络从手机到服务器的时长b
服务器时刻 = 手机发送请求的时刻a + 手机时刻B – 手机时刻A + 网络从手机到服务器的时长b

手机时刻A = 手机发送请求的时刻a
手机时刻B = 服务器接收到请求的时刻c – 网络从手机到服务器的时长b

服务器时刻x = 手机发送请求的时刻a + 服务器接收到请求的时刻c – 网络从手机到服务器的时长b – 手机发送请求的时刻a + 网络从手机到服务器的时长b
x = a + c – b – a + b
x = c

推算出来的时候,
连我自己都震惊到了,
简直太正确了再次推导手机时间误差 = 手机时刻B – 手机时刻A

手机时刻A = 手机发送请求的时刻a
手机时刻B = 服务器接收到请求的时刻c – 网络从手机到服务器的时长b

手机时间误差 = 服务器接收到请求的时刻c – 网络从手机到服务器的时长b – 手机发送请求的时刻a

发送一次请求以后, 服务器会返回服务器的时间,我们就可以求出手机时间误差, 然后我们把误差结果存起来

继续推导

服务器时刻 = 手机时刻 + 网络从手机到服务器的时长b
服务器时刻 = 手机当前时间 + 手机时间误差 + 网络从手机到服务器的时长b

这次推导就对了发送一次请求后, 我们可以推导出什么网络从手机到服务器的时长手机时间误差程序设计用脚本引擎启动一个单独的脚本, 每隔一段时间, 去校正一下两个值, 并且用本地存储存起来网络从手机到服务器的时长手机时间误差每当要获取服务器的时间, 我们就可以读取本地存储, 直接用公式计算出服务器的时间, 而不用去请求服务器服务器时刻 = 手机当前时间 + 手机时间误差 + 网络从手机到服务器的时长b代码"ui";
const 一般文字大小 = "22sp";
ui.layout(
<vertical>
<text text="牙叔教程 简单易学" textStyle="bold" textSize="30sp" w="*" gravity="center"></text>
<vertical margin="6">
<text text="服务器时间" textSize="{{一般文字大小}}"></text>
<text id="服务器时间"></text>
</vertical>
<vertical margin="6">
<text text="手机本地时间" textSize="{{一般文字大小}}"></text>
<text id="手机本地时间"></text>
</vertical>
<vertical margin="6">
<text text="服务器推导的手机时间" textSize="{{一般文字大小}}"></text>
<text id="服务器推导的手机时间"></text>
</vertical>
<horizontal margin="6">
<text text="手机时间误差(毫秒)" textSize="{{一般文字大小}}"></text>
<text id="手机时间误差"></text>
</horizontal>
<horizontal margin="6">
<text text="网络从手机到服务器的时长" textSize="{{一般文字大小}}"></text>
<text id="网络从手机到服务器的时长"></text>
</horizontal>
<button id="校正时间">校正时间</button>
</vertical>
);

ui.校正时间.click(function () {
let url = "https://api.m.jd.com/client.action?functionId=queryMaterialProducts&client=wh5";

// {"currentTime":"2021-05-10 11:26:41","currentTime2":"1620617201918","returnMsg":"empty parameter ids","code":"0","subCode":"1-3"}

let 手机发送请求的时刻a = new Date().getTime();
let r = http.get(url);
let 手机收到响应的时刻f = new Date().getTime();
let 网络从手机到服务器的时长b = (手机收到响应的时刻f – 手机发送请求的时刻a) / 2;
r = r.body.json();
let serverTime = r.currentTime2;
let 服务器接收到请求的时刻c = parseInt(serverTime);
let 手机时间误差 = 服务器接收到请求的时刻c – 网络从手机到服务器的时长b – 手机发送请求的时刻a;

ui.服务器时间.setText(服务器接收到请求的时刻c + "");
ui.手机本地时间.setText(手机发送请求的时刻a + "");
ui.服务器推导的手机时间.setText(服务器接收到请求的时刻c – 网络从手机到服务器的时长b + "");
ui.手机时间误差.setText(手机时间误差 + "");
ui.网络从手机到服务器的时长.setText(网络从手机到服务器的时长b + "");
});声明部分内容来自网络

本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://www.175ku.com/26959.html