autojs时间同步

简介: 牙叔教程 简单易学

牙叔教程 简单易学


autojs版本

8.7.7-0


目标

手机和服务器时间尽可能一致


各个时间的关系



  1. 手机发送请求的时刻a + 网络从手机到服务器的时长b = 服务器接收到请求的时刻c
  2. 服务器发送响应的时刻d + 网络从服务器到手机的时间e = 手机收到响应的时刻f
a + b = c
d + e = f


3.服务器处理速度较快, 可以认为 服务器接收到请求的时刻c=服务器发送响应的时刻d
服务器处理速度较快, 可以认为 网络从手机到服务器的时长b=网络从服务器到手机的时间e

c === d
b === e


4.由 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


  1. 服务器时刻 = 手机时刻 + 网络从手机到服务器的时长b
  2. 手机时刻是知道的
new Date().getTime()


网络从手机到服务器的时长也是知道的

第4步可以求解, 获取网络从手机到服务器的时长


服务器时刻也就可以计算出来了

  1. 到这里就完了吗?
    图样图森破


手机时间的误差

手机一般默认设置 使用网络提供的时间

这个时间和服务器的时间一定是有误差的

我们还要把这个误差考虑进去

那么, 这个误差怎么算呢


当手机向服务器查询一次当前时间,

会产生一个手机时刻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 + "");
});


声明

部分内容来自网络

相关文章
|
存储 Cloud Native Linux
C++11 auto限制
C++11 auto限制
|
6月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
155 6
|
7月前
|
SQL 数据库管理
|
8月前
|
编译器 C++ 容器
在 C++ 中 auto什么意思
在 C++ 中 auto什么意思
119 0
|
SQL 关系型数据库 MySQL
MySQL AUTO_INCREMENT 原理解析
在关系型数据库MySQL中,AUTO_INCREMENT是数据库的一个属性,该属性使得在申明了AUTO_INCREMENT的列中可以自动生成唯一的递增值。本文详细介绍了在InnoDB及MyISAM引擎中AUTO_INCREMENT的使用原理及一些容易被忽略的问题。
|
关系型数据库 MySQL 开发者
MySQL 字段约束 null, not null, default, auto_increment
前言:转载,觉得有用就发了一遍 在 MySQL 中,每个字段定义都包含附加约束或者修饰符,这些可以用来增加对所输入数据的约束。 今天我们就来看一下 MySQL 的字段约束: NULL 和 NOT NULL 修饰符、DEFAULT 修饰符,AUTO_INCREMENT 修饰符。
241 0
|
C++ 容器
C++中的auto
C++中的auto
|
关系型数据库 MySQL
MySQL 中 auto_increment 自动插入主键值
对于整数类型的主键,常搭配自增长 auto_increment 来使用。插入数据对应的字段不给值时,使用最大值+1!! 🌘下面进行演示~~🌒
MySQL 中 auto_increment 自动插入主键值
|
存储 缓存 算法
PolarDB-X 中的 AUTO_INCREMENT 兼容性
分布式系统和分布式数据库中,有哪些实现全局唯一 ID 的典型方案?在满足了全局唯一的要求后,如何在分布式数据库中兼容 MySQL AUTO_INCREMENT 特性?PolarDB-X 是怎样做到兼容 AUTO_INCREMENT 功能,又能保持高性能水准的?本文将揭示这些细节。
1468 1
|
10月前
|
SQL 关系型数据库 MySQL
记一次MySQL AUTO_INCREMENT的故障
一、前言开发突然紧急的过来说,他们记录无法插入了,有报重复键错误ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY'表名和数据都是采用测试数据,结果和生产的现象是一致的二、分析测试环境为percona server 5....
204 0