我想做个活动页面,页面有个倒计时展示,开始时间和结束时间从后台服务器获取。然后情况可能是这样的:
1
:如果当前时间距离活动开始时间(活动还没有开始
)的情况下。显示活动还没有开始距离活动开始还有多少时间。
2
:如果设置的开始时间就是当前时间,那么倒计时开始展示,一直到结束时间,然后显示活动已经结束。
情况是这样,想请教下具体怎么实现的,还有就是当前时间应该是服务器时间,客户端的时间有可能本地修改了之后就不对了
我想做个活动页面,页面有个倒计时展示,开始时间和结束时间从后台服务器获取。然后情况可能是这样的:
1
:如果当前时间距离活动开始时间(活动还没有开始
)的情况下。显示活动还没有开始距离活动开始还有多少时间。
2
:如果设置的开始时间就是当前时间,那么倒计时开始展示,一直到结束时间,然后显示活动已经结束。
情况是这样,想请教下具体怎么实现的,还有就是当前时间应该是服务器时间,客户端的时间有可能本地修改了之后就不对了
谢邀。
这种是一个比较常见的需求了吧,常见于电商,下面以秒杀为例子。
基本思路是,加载一个页面,ajax请求或者填页面模版,获取到开始和结束时间,后面以ajax请求为例子。
然后用js读取当前系统的时间,再读取响应头(ajax请求)中的系统时间,两相对比,设定一个差值,一般情况两者应该相差不大,差别顶多是毫秒级的,所以,对时到分钟数,如果两端不一致就重刷,或者提醒系统时间异常(注意浏览器时间的时区和服务器是否一样,服务器大都是格林威治时间)。
然后,对比开始和结束时间,出不同的按钮。
关键点来了,可能也是题主担心的地方,就是系统时间不准确或者被别有心机的用户篡改,这个时候该怎么处理或者容错。
这个时候应该按照正常的js逻辑显示相应的按钮,比如秒杀按钮,用户点击后,依然发送ajax请求,因为前端永远都保证不了数据的准确性。后端收到请求,先检查是否在活动时间内,再进下一个判断支,不然直接返回报错,刷新页面或者提醒时间。
描述的比较冗杂,很大一坨逻辑,就不想写demo了,思路清晰就好。
谢邀。看到题主的描述以及其它答案基本都解决问题了,本着邀请还是说一下自己的观点。
整理一下思路,无论是服务端获取时间还是客户端获取时间,在活动前后防止暴露请求数据或者链接。
前台js执行倒计时操作,到时后请求指定接口返回数据或者重定向页面,看实际方案。但有一点,这次请求服务端验证当前请求的服务端时间与活动时间是否一致再执行其它逻辑。
10 回答11.2k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
js获取服务器时间
使用
Ajax(cache: false)
去GET当前js文件读取其
HTTP
的Date
头(服务器端时间),根据此头计算客户端与本地时间的差异。然后每次计算倒计时的时候
这个涉及到以下知识点:
HTTP头知识
Ajax知识(同步、异步、Cache)
浏览器<head>加载顺序、加载执行JS时间,浏览器渲染时间
网络通讯误差、服务端脚本执行误差
当然,这个答案也并不完美,也会有毫秒级别的误差(Date头无法输出毫秒)。
如果想修正时间到100ms以内,可以在1500毫秒内,重复取deltaTime多次,然后使用算法依次的修正误差
倒计时实现代码:
获取倒计时、获取服务器时间,计算客户端和服务器时间的差异
使用方法:(本地文件无法测试,必须有服务器环境)
服务器
服务器端需要满足如下条件:
Redis队列记录秒杀瞬间数据,并记录用户ID、秒杀时间(毫秒)
Redis数据回写到MySQL
以上条件满足不了,那就弄个好一点的MySQL
时间同步,JS、PHP、MySQL、Redis的这些服务器时间必须是同步
秒杀只是一定程度上的公平,带有运气性质,所以算法在一定程度上公平就好了
楼主说的篡改本地时间的问题
不论你的本地时间多么离谱,deltaTime的计算都是正确的,然后倒计时也是实时取,显示绝对正确
除非你在倒计时过程中修改本地时间,那样你只是玩单机,服务器端有时间的,你改也就自娱自乐