前言
最近项目的编写中,接口需要提交精确到秒级的时间戳用作校验。但是仅仅使用System.currentTimeMillis()
会面临着本地的时间与服务器时间不一致的问题。那么本文方案能让本地应用时间与服务器时间存在误差范围内保持同步,减少应用出错率。
预备知识
SystemClock.elapsedRealtime()
:手机系统开机时间(包含睡眠时间),用户无法在设置里面修改。- 在必要的时刻获取一下服务器时间,然后记录这个时刻的手机开机时间(elapsedRealtime)
- 后续时间获取:现在服务器时间 = 以前服务器时间 + 现在手机开机时间 - 以前服务器时间的获取时刻的手机开机时间
- 利用OkHttp的Interceptor自动同步时间
TimeUtils编写
1 | import android.os.SystemClock; |
原理就是通过HTTP Header来获取服务器时间(注:时间格式以RFC-7231中定义的”HTTP日期”格式来发送)
在OkHttpClient增加该Utils下的拦截器即可。
由于项目中只需要精确到秒,而获取的都是精确到毫秒级别,所以TimeUtils下获取的时候做了除以1000处理。可能会存在点误差吧。但是在项目中误差范围不大,还在可接受范围内。
不足:连接服务器的过程是需要时间的,服务器收到请求时刻的时间与应用收到响应存在一定的时间差,导致误差的存在(误差=服务器发出响应->到本机收到响应这个时间)。
但是通过上面的TimeSyncInterceptor每次判断,可以使得误差逐渐降低