Android 客户端与服务器端时间校准
开发app时发现APP显示的时间不准,或者说APP时间与服务器时间不一致,会导致数据请求、数据显示等各种问题。这时候我们就需要一种机制来解决时间不一致的问题。
第一个解决方法:
- 服务器端永远使用UTC时间,包括参数和返回值,不要使用Date格式,而是使用UTC时间1970年1月1日的差值,即long类型的长整数。
- APP端将服务器返回的long型时间转换为GMT8时区的时间,额外加上8小时,这样就保证了无论使用者在哪个时区,他们看到的时间都是同一个时间,也就是GMT8的时间。
- APP本地时间会不准,少则差几分钟,多则十几分钟,要解决这个问题,我们可以使用HTTP Response头的Date属性,每次调用服务器接口时就取出HTTP Response头的Date值,转换为GMT时间,再减去本地取出的时间,得到一个差值d,我们将这个差值d保存下来。每次获取本地时间的时候,额外加上这个差值d,就得到了服务器的GMT8时间,就保证了任何人看见的时间都是一样的。
public static void getServerTimeDelta(Header header){if (header != null) {String strServerDate = header.getValue();if (!TextUtils.isEmpty(strServerDate)){//Thu, 29 Sep 2016 07:57:42 GMTfinal 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);delta = serverDate.getTime()-System.currentTimeMillis(); } catch (ParseException e) {e.printStackTrace();} catch (java.text.ParseException e) {e.printStackTrace();}}} }
使用时加上差值:
Date serverTime = new Date(System.currentTimeMillis()+<span style="font-family: 'microsoft yahei';">delta</span>);
但这个解决办法有几个问题:
1、用户使用过程中修改了时间,这时就坑了,时间完全不正确了
2、server时间到客户端交互需要时间,最后换算出的时间也不是非常准确
第二种解决办法:
使用第一种方法时,用户修改了手机本地的时间,时间肯定会出错,这种情况确实比较坑爹。但是Android还比较友好,就是如果用户修改了时间和修改了时区都会发广播,我们可以 设置一个receiver来监听几个广播,然后重新设置服务器时间。
Intent.ACTION_TIME_CHANGED Intent.ACTION_DATE_CHANGED
但是因为这个广播就算有了,我们也不知道用户修改了多少时间,除非重新去服务器拉取服务器 时间,但是在服务器拉取失败或者在服务器拉取时间的这个请求内需要使用服务器时间的情况处 理就比较麻烦了。
其实我们弄这么多,这么复杂其实只是需要知道手机本地当前时间与设置服务器时间的时候的绝对的时间差。
使用SystemClock.elapsedRealtime() :Returns milliseconds since boot, including time spent in sleep. 同步服务端时间
public static void getServerTimeDelta(ResponseInfo<String> responseInfo){if (responseInfo != null) {Header headers = responseInfo.getFirstHeader("Date");String strServerDate = headers.getValue();if (!TextUtils.isEmpty(strServerDate)){//Thu, 29 Sep 2016 07:57:42 GMTfinal 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);GeexekApplication.ResponseTime = serverDate.getTime();GeexekApplication.ResponseCurrentTime =SystemClock.elapsedRealtime(); }catch(Exception exception){exception.printStackTrace();}}}}
获取当前时间:
long currentMilliseconds = GeexekApplication.ResponseTime + SystemClock.elapsedRealtime()-GeexekApplication.ResponseCurrentTime;
评论:
这种方法计较准确,本人就选择了这种办法。
相关文章:
Android服务器时间校准
Android 客户端与服务器端时间校准相关推荐
- APP(Android版)客户端与服务器端时间校准
APP开发人员经常会遇见一个bug就是,APP显示的时间不准,或者说APP时间与服务器时间不一致,会导致数据请求.数据显示等各种问题.这时候我们就需要一种机制来解决时间不一致的问题. 解决方案如下: ...
- 一个简单的Android客户端从服务器端获取json数据并解析的实现代码
今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码代码如下: /** ...
- Android客户端与服务器端socket通讯
Android客户端与服务器端的Socket通讯: socket通讯依赖IP地址和端口号,每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 服务器端代码: 实例化主类, ...
- 配置ntp客户端与服务器端时间的同步
1,实验机器介绍 Ip地址 服务器1 192.168.245.128 服务器2 192.168.245.130 客户端1 192.168.245.129 实验前准备 在ntpS1 和ntpS2 中,配 ...
- Android 客户端与服务器端进行数据交互(一、登录服务器端)
概要 安卓APP要实现很多功能(比如登录注册.发表评论等)时都必须要使用到网络数据交互.所以在学习了这部分内容后,就将其以最常见的登录过程为例整理出来,也方便跟我一样的新手能迅速学习上手. 预期效果图 ...
- Android客户端请求服务器端的详细解释(附源代码)
Android客户端请求服务器端的详细解释 1. Android客户端与服务器端通信方式: Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和po ...
- android客户端从服务器端获取json数据并解析的实现代码
2019独角兽企业重金招聘Python工程师标准>>> 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 代码如下: /** * 从指定的URL中获取 ...
- Socket编程(Android客户端+PC服务器端)
一个多月没有写东西了,感觉像过了一个暑假...废话不多说了,今天来记录一下这两天学习Socket的内容.按照我研究思路来进行一步步的深入Socket. 一.什么是Socket 网络上的两个程序通过一个 ...
- Android客户端与服务器端交互,如何保持session回话
前言 最近在开发项目的过程中,遇到Android与web服务器要在同一session下通信的问题. 一.Session与Cookie的共性与区别: ①.共性 Cookie和Session都为了用来保存 ...
最新文章
- c++之openGL在VS中的配置及简单图形绘制
- 马云马化腾李彦宏在IT峰会上的话-内容提炼
- 使用Gson进行json数据转换list to json 和json to list
- linux环境变量与文件查找
- 数据结构的简单理解(1)
- Power Strings POJ - 2406(求一串字符串中有多少个循环节)
- Exynos4412 Uboot 编译工具 —— 交叉工具链 arm-linux-gcc 的安装
- 学校邮箱注册IDEA、pycharm等全家桶(正式版就是香)
- 自动驾驶使用贝塞尔曲线进行动态障碍物避障测试
- java获取当前日期时间_Java日期时间API系列10-----Jdk8中的DateTimeFormatter
- 从零开始学前端:字符串和数组的方法 --- 今天你学习了吗?(JS:Day10)
- Java 连接LDAP实现验证与查询用户
- STL源码剖析-vector
- 【动态规划区间dp】蓝桥2019:最优包含
- linux中使用u盘和光驱的命令_linux命令详解之挂载光驱的方法
- MT【293】拐点处切线
- vue单页面应用初始加载登录页_6 种 Vue 权限路由实现方式总结(最全)
- 使用Dragonfly上传Rails图片
- 超级会员创作者收益说明
- Capture Modules 车载网络报文捕获(监听)模块(低时延、802.1AS时钟同步)
热门文章
- Mc1.16forge官混教程/教补-#3 物品材质覆盖注意要点[分支1]
- Linux模块(2) - 创建设备节点
- C++之相对路径转绝对路径
- java_获得用户显示器大小
- [转载]一篇经典的求职经历博客,值得深入研究和学习
- 按头安利 好看又实用的运动健身 体育海报模板素材看这里
- 用python成为顶级黑客-python绝技:运用python成为顶级黑客 PDF 超清中文版
- Qt ‘tr‘ was not declared in this scop
- windows下编译64位x264
- 小玩意 - CSDN 插件(Chrome版)