转自:

https://blog.csdn.net/qinci/article/details/70666631这个的吧?转发请注明来源吧?Android时间与服务器同步方法_飛舞的青春的博客-CSDN博客Android时间与服务器同步方案 在部分软件应用场景里,我们对应用时间要求非常苛刻,如活动、商品秒杀倒计时操作,防止用户修改本机时间,导致应用错乱。 我们如果能让本地应用时间与服务器时间在误差应许范围内,保持同步,就能有效减少应用出错率。1. 预备SystemClock.elapsedRealtime() :手机系统开机时间(包含睡眠时间),用户无法在设置里面修改在必要的时刻获取https://blog.csdn.net/qinci/article/details/70666631

前言

在部分场景里,应用对时间的要求比较严苛,比如金融类app,股票类、期货等,对交易区间的判断是非常重要的。这就需要客户端的时间与服务器时间或者是世界标准时间同步,而不能简单地获取本地时间就可以了。

本方案思路

基于android系统提供的方法SystemClock.elapsedRealtime(),即手机系统开机时间。再配合服务器时间(或世界标准时间)实现移动端时间的准确性。

  1. SystemClock.elapsedRealtime() :手机系统开机时间(包含睡眠时间),用户无法修改
  2. 在必要的时刻获取一下服务器时间,然后记录这个时刻的手机开机时间(elapsedRealtime)
  3. 后续时间获取:现在服务器时间 = 以前服务器时间 - 以前服务器时间的获取时刻的手机开机时间 + 现在手机开机时间

移动端启动系统时间 = 以前服务器时间 - 以前服务器时间的获取时刻的手机开机时间

具体代码如下

/*** <pre>* author : Haitao* blog   : http://blog.nhtzj.com* time   : 2018/4/2* desc   : Android时间与服务器同步方案<br>*          1.SystemClock.elapsedRealtime() :手机系统开机时间(包含睡眠时间),用户无法在设置里面修改<br>*          2.在必要的时刻获取一下服务器时间,然后记录这个时刻的手机开机时间(elapsedRealtime)<br>*          3.后续时间获取:现在服务器时间 = 以前服务器时间 + 现在手机开机时间 - 以前服务器时间的获取时刻的手机开机时间<br>* version: 2.0* </pre>*/
public class TimeManager {private static TimeManager instance;private long differenceTime;        //以前服务器时间 - 以前服务器时间的获取时刻的系统启动时间,即:手机开机时的服务器时间private boolean isServerTime;       //是否是服务器时间private TimeManager() {}public static TimeManager getInstance() {if (instance == null) {synchronized (AppManager.class) {if (instance == null) {instance = new TimeManager();}}}return instance;}/*** 获取当前时间** @return the time*/public synchronized long getServiceTime() {if (!isServerTime) {//todo 这里可以加上触发获取服务器时间操作return System.currentTimeMillis();}//时间差加上当前手机启动时间就是准确的服务器时间了return differenceTime + SystemClock.elapsedRealtime();}/*** 时间校准** @param lastServiceTime 当前服务器时间* @return the long*/public synchronized long initServerTime(long lastServiceTime) {//记录时间差differenceTime = lastServiceTime - SystemClock.elapsedRealtime();isServerTime = true;return lastServiceTime;}
}

然后只要把软件调用System.currentTimeMillis()全部替换成TimeManager.getInstance().getServiceTime();即可获取到准确时间。

利用OkHttp的Interceptor自动同步时间

使用了Okhttp请求框架的,可以利用OkHttp的Interceptor自动同步时间

  1. 网络响应头包含Date字段(世界标准时间)。比如:Date: Mon, 02 Apr 2018 12:36:04 GMT,换算成本地时间,需要知道用户所在的时区
  2. 利用Interceptor记录每次请求响应时间,如果本次网络操作的时间小于上一次网络操作的时间,则获取Date字段,转换时区后更新本地TimeManager。
  3. 这样时间就只会越来越精确了

详细代码如下

/*** <pre>* author : Haitao* blog   : http://blog.nhtzj.com* time   : 2018/4/2* desc   : 利用OkHttp的Interceptor自动同步时间* version: 2.0* </pre>*/
public class TimeCalibrationInterceptor implements Interceptor {long minResponseTime = Long.MAX_VALUE;@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();long startTime = System.nanoTime();Response response = chain.proceed(request);long responseTime = System.nanoTime() - startTime;Headers headers = response.headers();calibration(responseTime, headers);return response;}private void calibration(long responseTime, Headers headers) {if (headers == null) {return;}//如果这一次的请求响应时间小于上一次,则更新本地维护的时间if (responseTime >= minResponseTime) {return;}String standardTime = headers.get("Date");if (!TextUtils.isEmpty(standardTime)) {Date parse = HttpDate.parse(standardTime);if (parse != null) {// 客户端请求过程一般大于比收到响应时间耗时,所以没有简单的除2 加上去,而是直接用该时间TimeManager.getInstance().initServerTime(parse.getTime());minResponseTime = responseTime;}}}
}

之后将改Interceptor添加入OkHttpClient即可。

OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(20000L, TimeUnit.MILLISECONDS).readTimeout(20000L, TimeUnit.MILLISECONDS).addInterceptor(new RetryIntercepter(2)) //出错重试.addInterceptor(new LoggerInterceptor("TAG", true)) //Log 打印信息.addInterceptor(new TimeCalibrationInterceptor()) //时间同步.build()

OK,大功告成!!!

Android时间与服务器同步方案相关推荐

  1. Javascript实现秒杀倒计时(时间与服务器时间同步)

    转自: http://hi.baidu.com/flondon/item/04e89ece8f5ecf0d0ad93a98 Javascript实现秒杀倒计时(时间与服务器同步) 现在有很多网站都在做 ...

  2. mysql和elastic search数据同步方案

    方案一 利用es api实时写入es中 优点:实时性高,能灵活控制写入es的时间 缺点:同步方案与业务逻辑耦合,严重依赖于es api,破坏了原有业务程序逻辑 demo:https://blog.cs ...

  3. 金山逍遥网 sersync 服务器实时镜像同步方案

    金山逍遥网 sersync 服务器实时镜像同步方案 1. sersync+rsync原理 2.inotify和sersync同步的区别 3. 配置sersync+rsync实现实时同步 2台cento ...

  4. 游戏服务器 数据同步方案

    游戏数据同步方案 首先我们介绍实时对战手游中最难解决的技术问题--弱网络下的数据同步问题. 通过对玩家的游戏数据进行观察,发现玩家的游戏环境存在很大差异,不同玩家会使用不同的2G/3G/4G/Wifi ...

  5. 中兴如何远程服务器时间同步,IPRAN时钟同步方案分析

    随着4G通信技术越来越广泛的应用,无线回传网络进入全IP时代.传统无线基站通过GPS完成时钟.时间同步,但GPS占据一定的工程成本,并且存在较大国家安全隐患,再加上有些室内覆盖场景无法部署GPS,运营 ...

  6. Android 10.0 framework设备联网后系统时间没有自动同步更新的修改

    1.概述 在定制化10.0的产品开发中,在产品联网后系统都会自动同步时间,但在一些产品中,会出现即使联网了也不会同步时间的情况,开始以为是设备的网络问题,咨询同事和百度发现谷歌服务器会出现在大陆时间同 ...

  7. 如何让linux服务器同步互联网时间

    今天在工作中需要搭建一个数据库集群s1,需要将节点A.节点B和节点C都加入集群,先在A节点上创建集群,然后将B和C节点加入到集群,但是在B和C加入到集群之前,会判断B与A.C与A的时间戳是不是在设置的 ...

  8. ntp服务器同步时间详细配置

    部署NTP服务器进行时间同步 NTP服务端:linl_S    IP:10.0.0.15 NTP客户端:lin_C    IP:10.0.0.16 NTP服务概述 1.原理 NTP(Network T ...

  9. win10修改时间同步服务器,解决win10时间服务器同步问题|重置win10时间服务配置...

    Windows 任务栏右下角的日期时间,平时可以方便我们查看,帮助我们更好的安排时间.但是有些用户发现Windows时间错误了,调整过好几次,时间还是不对,这篇文章是PE吧给大家带来的使用命令提示符重 ...

最新文章

  1. 南大计算机学硕复试,2019南大CS考研复试笔试回忆
  2. 2021年编程语言趋势预测:Python和JavaScript仍火热,Go不可小觑
  3. php pdo操作数据库
  4. 记一次 .NET 某电商交易平台Web站 CPU爆高分析
  5. shell中执行某条语句失败能不能重复执行_如何理解Mysql中的事务隔离级别?
  6. Jakarta-ORO正则表达式的运用
  7. 正态分布初始化 torch.nn.Embedding.weight()与torch.nn.init.normal()的验证对比
  8. android 连接魅族手机,android studio连接魅族真机
  9. 关注手机病毒:重点手机安全事件盘点
  10. 批量对word文档进行操作
  11. Python精灵模块:走来走去的小猫咪
  12. Linux系统CentOS 7中安装配置JDK
  13. 你可以不喜欢我,但无法否定我
  14. vue项目中实现录屏两种方式rrweb和RecordRTC
  15. Android开发:开源库集合
  16. ug更改java的环境变量_UG中的语言环境变量设置
  17. 通过经纬度解析商圈Scala实现方式
  18. 王者荣耀进阶教学攻速/移速/减伤机制/视野/意识
  19. 锁屏解锁-KeyguardManager
  20. No qualifying bean of type ‘com.alibaba.buc.acl.api.service.MenuReadService‘ available

热门文章

  1. 硬盘存储结构及分区简介
  2. 大数据概论、大数据概念、大数据特点(4V)、Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、大数据应用场景、大数据发展前景、大数据部门间业务流程分析
  3. 【题解】曼哈顿模拟赛(洛谷)
  4. 了解Nape 2d物理引擎 第一天
  5. 七牛云获取token中的bucket是什么?
  6. 命令行连接mongo数据库
  7. Mat—基础图像容器(OpenCV教程)
  8. 超级简单得App自动化demo,有手就会,Weditor + uiautomator2 实现app自动化
  9. Windows 微信3.3.0内测如何申请,附报名及下载地址
  10. 计算机复制方法有,电脑复制粘贴怎么用(6种电脑复制粘贴方法)