背景:
某项目前端使用HTML5,后端提供HTTP接口,某个功能是前端显示合约倒计时(合约生效日期及结束日期配置在DB),容许少许偏差javascript
方案1:
后端提供的接口只返回合约结束时间,前端直接将后端返回的结束时间减去客户端时间即为倒计时
陷阱:客户端的时间用户是能够随意改的,甚至用户的时区都有可能不一样,因此这种方法统计出来的倒计时必然是不能获得保证的
方案2:
后端提供的接口只返回由后端计算出来的倒计时(虽而后端机器可能有多台,但跟用方案1比毕竟机器可控),前端直接使用该倒计时,使用setInterval()函数
但是运行了一段时间以后,时间却不许了,为何呢?原来:js实质是单线程的,通过一段时间后,倒计时时间差别会变大而慢慢变得不许。若是赶上机器休眠那差距就更大了。前端
方案3:
后端返回结束时间+后端计算出来的倒计时,前端也计算倒计时与服务端算出来的做为偏移量,每一个循环取前端取结束时间+偏移量-当前时间,算法以下java
//endTime和leftTimeMillions来自后端,分别表明结束时间与剩余时间毫秒数 var currentTime = new Date().getTime(); //先后端时间误差量 var offset = endTime - currentTime - leftTimeMillions; //倒计时 var leftTimeResult = endTime - currentTime + offset;