【声明:】本文是作者(蘑菇v5)原创,版权归作者 蘑菇v5所有,侵权必究。本文首发在简书。如若转发,请注明作者和来源地址!未经授权,严禁私自转载!

在项目的开发过程中,项目要求无论终端是什么时区设置、地处何方,终端的时间是否正确,终端的时间始终要求与服务器同步,也就是说,用户买来一部新手机、新平板,不做任何日期时间、时区方面的设置,装了App就显示当前时间。

原理:

现在服务器时间 = 以前服务器时间 + 现在手机开机时间 – 以前服务器时间的获取时刻的手机开机时间

开始之前,先认识两个时间,分别是System.currentTimeMillis()和SystemClock.elapsedRealtime()。System.currentTimeMillis()获取的是系统时间,是距离1970年1月1日开始计算的一个值。获取当前日期,如当前是xxxx年xx月xx时xx分xx秒xxx毫秒,这个值在系统设置中可以更改的。

而SystemClock.elapsedRealtime()获取从设备boot后经历的时间值,是系统从启动到现在的时间(包含休眠时间),这个值在系统设置中是不可以被更改的。

思路:

使用elapsedRealtime同步服务端时间,就是说在必要的时刻获取一下服务器时间,然后记录这个时刻的手机开机时间(elapsedRealtime),两者作差,获取到设置服务器时间的时候与手机本地当前elapsedRealtime的绝对的时间差。即获取到的服务器时间- 当时手机的elapsedRealtime。 这个差值是固定的,只要请求一次服务器接口后,就可以根据本地时间推算出服务器时间,实现本地时间与服务器时间同步。

代码如下:

/**

* 获取服务器时间

* @param response

*/

public static void getServerTimeDelta(Response response){

if (response != null) {

Headers headers = response.headers();

String strServerDate = headers.get("Date");

if (!TextUtils.isEmpty(strServerDate)){

//Thu, 29 Sep 2016 07:57:42 GMT

final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z",

Locale.ENGLISH);

TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));

try {

Date serverDate = simpleDateFormat.parse(strServerDate);

//在必要的时刻获取一下服务器时间

MyApplication.ResponseTime = serverDate.getTime();

//记录这个时刻的手机开机时间

MyApplication.ResponseCurrentTime = SystemClock.elapsedRealtime();

}catch(Exception exception){

exception.printStackTrace();

}

}

}

}

获取当前时间:

//获取当前手机时间,即远程服务器的时间

long currentTime = MyApplication.ResponseTime + SystemClock.elapsedRealtime()

-MyApplication.ResponseCurrentTime;

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String dateString = formatter.format(currentTime);

效果如下:

第一次请求到的服务器时间:

第一次请求到的服务器时间

故意手机调错后,获取的手机本地时间,和获取的同步的服务器时间format

手机调错后,获取的手机本地时间

两分钟后,效果依旧。

两分钟后,效果依旧

android 自动校准时间,Android客户端怎么同步校准服务器上的时间相关推荐

  1. 服务器同步电脑文件夹在哪,把文件同步到服务器上

    把文件同步到服务器上 内容精选 换一换 当服务器A和服务器B同时挂载同一文件系统C时,在服务器A上传文件,服务器B同步此文件时存在延时,而单独上传至服务器B则没有延时.需要在两个服务器的挂载参数中增加 ...

  2. 怎么把文件同步到服务器,把文件同步到服务器上

    把文件同步到服务器上 内容精选 换一换 当服务器A和服务器B同时挂载同一文件系统C时,在服务器A上传文件,服务器B同步此文件时存在延时,而单独上传至服务器B则没有延时.需要在两个服务器的挂载参数中增加 ...

  3. 如何使用Pycharm2019连接服务器,同时在Pycham2019中同步修改服务器上的代码

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 文章目录:如何使用Pycharm2019连接服务器,同时在Pycham2019中同步修改服务器上的代码 1 让本机的Py ...

  4. 关于同步VSS服务器上的代码发生Eclipse里面的项目全部不见了

    有次在同步VSS服务器上的代码的时候突然发生了错误(同步的代码的项目竟然消失了)....如下图 Could not open the editor: The file does not exist. ...

  5. 在虚拟机上同步服务器上的时间_Hbase

    局域网内Linux服务器时间同步 环境:oracle linux5.6 oracle11gR2.0.2 (active dataguard) 最近发现在几个服务器的系统时间不准了,数据库上线才4个多月 ...

  6. volley 调用php接口,从Android发送数组并使用Volley在PhP服务器上...

    嗨,我想将字符串值数组发送到PhP服务器并进行PhP解码并将其存储在PhP变量中 这是我在android studio上的代码 private void getEventDetailRespond(R ...

  7. 使用rsync同步linux服务器上的文件到windows上

    需求: 在windows客户端上执行计划任务同步脚本,从linux服务器上同步对应模块下的目录内容到windows客户端的D:\data目录下. 步骤: 1. rsync服务端操作略: (百度一下都有 ...

  8. 从授时服务器上获得时间

    在一个局域网中,许多系统都要求每台计算机能够保持时间的一致性,WIN2000系统提供了与主域服务器时间同步功能,即工作站只要登录到主域服务器,工作站系统的时间自动与主域服务器时间一致,但接下来的问题是 ...

  9. Android 滴滴打车,打车软件客户端实现小车在地图上平滑移动的实现;基于高德地图V4.1.1+

    上次写的滴滴打车软件小车平滑移动的demo,看到很多人在问我要例子: 最近有研究了下高德地图API:发现官网更新了api: Marker类新增平移.旋转.缩放等动画效果: 这样的话我们实现平滑移动就非 ...

  10. 【Android 系统开发】下载 编译 Android源代码 和 Android kernel源代码

    下载Android源码简要流程 : a. 获取repo文件: curl http://commondatastorage.googleapis.com/git-repo-downloads/repo ...

最新文章

  1. 给树莓派增加微型摄像头 Raspberry Mode4
  2. DPDK — CLI 指令行模块
  3. Lazada2022新开店入驻流程及费用
  4. pythonanywhere使用:进入虚拟机及修改django项目的css样式
  5. 马尔可夫链算法原理与实现
  6. dijkstra算法_最短路径问题——迪杰斯特拉算法(Dijkstra)
  7. echarts x轴像直尺一样设置刻度_MATLAB作图实例:6:指定轴刻度值和标签
  8. oneproxy mysql_在OneProxy的基础上实行MySQL读写分离与负载均衡
  9. python学生管理系统(函数方法)_(python函数)学生管理系统
  10. typora绑定github博客_零基础搭建个人博客
  11. oracle客户端ora 12541,Oracle 11g 64bit下程序报ORA-12541: TNS: 无监听程序解决办法
  12. OSPF邻接关系状态机
  13. 小程序的全栈开发新时代
  14. 19. Window focus() 方法
  15. 专网解决方案:中兴以全光园区解决方案打造智慧园区
  16. 【c++实现】模拟银行叫号系统
  17. 09-TensorFlow 基于WDCNN的轴承故障诊断
  18. 工业相机和普通相机的区别详解_工业相机与普通相机的差别
  19. python音乐可视化效果_Python数据可视化 | 网易云音乐年度歌曲
  20. java技术学习交流群,诚邀您的加入

热门文章

  1. OCR测试——字体和背景颜色
  2. 爆赞,java后端开发路线。
  3. 电子海图领域一些概念名词的梳理
  4. 反编译获取任何微信小程序源码
  5. RN 开发遇到的问题之传参函数错误Invariant Violation: Maximum update depth exceeded.
  6. Oracle函数-分析函数-获取上一条(下一条)记录
  7. dataStudio安装激活教程
  8. js加载本地shp数据到地图上_地图服务矢量数据获取方法总结
  9. 接口测试之抓包工具fidder
  10. [杂谈] 9. C语言中getch()函数