Android 客户端与服务器端时间校准
来源:互联网 发布:项羽彭城之战 知乎 编辑:程序博客网 时间:2024/04/18 17:54
开发app时发现APP显示的时间不准,或者说APP时间与服务器时间不一致,会导致数据请求、数据显示等各种问题。这时候我们就需要一种机制来解决时间不一致的问题。
第一个解决方法:
public static void getServerTimeDelta(Header header){ if (header != null) { String strServerDate = header.getValue(); 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); 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_CHANGEDIntent.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 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); GeexekApplication.ResponseTime = serverDate.getTime(); GeexekApplication.ResponseCurrentTime =SystemClock.elapsedRealtime(); }catch(Exception exception){ exception.printStackTrace(); } } }}
获取当前时间:
long currentMilliseconds = GeexekApplication.ResponseTime + SystemClock.elapsedRealtime()-GeexekApplication.ResponseCurrentTime;
评论:
这种方法计较准确,本人就选择了这种办法。
相关文章:
Android服务器时间校准
0 0
- Android 客户端与服务器端时间校准
- 羊皮书APP(Android版)开发系列(十一)客户端与服务器端时间校准
- 客户端与服务器端时间保持一致
- ios 客户端校准标准时间
- Android客户端与电脑服务器端
- Android服务器时间校准
- Android客户端与服务器端交换之客户端
- android 客户端与web服务器端通信
- android客户端与c#服务器端的通信
- Android客户端与服务器端(struts2)通信
- android文件上传客户端与服务器端代码
- MINA框架----------android客户端与服务器端
- Android客户端与服务器端交互方式总结
- android客户端与服务器端的简单交互
- Android客户端与服务器端简单交互
- Android客户端与服务器端数据同步
- Android 实现蓝牙客户端与服务器端通信
- Android客户端与服务器端数据库同步
- web前端开发之几种布局方式之响应式布局
- Nginx配置文件详解总结
- 利用 Linux Lab 完成嵌入式系统软件开发全过程
- git工作实录
- React Native 中组件的生命周期
- Android 客户端与服务器端时间校准
- 第7周项目5 排队看病模拟
- 详细解读Jquery各Ajax函数,$.get(),$.post(),$.ajax(),$.getJSON()
- JAVA从菜鸟【入门】到新手【实习】一一Python学习历程:游戏学Python:文字猜数游戏
- -bash: sftp: command not found
- 曲线斜率与法向量综合辨析
- 没GPU也能玩梵高作画:Ubuntu tensorflow CPU版
- OpenCV中读取图像像素值
- 利用mvn deploy命令上传包