本文属于转载,转载地址:http://hi.baidu.com/flondon/item/04e89ece8f5ecf0d0ad93a98
现在有很多网站都在做秒杀商品,而这其中有一个很重要的环节就是倒计时。
关于倒计时,有下面几点需要注意:
1.应该使用服务器时间而不是本地时间(本地时间存在时区不同、用户自行设置等问题)。
2.要考虑网络传输的耗时。
3.获取时间时可直接从AJAX的响应头中读取(通过getResponseHeader('Date')来获得),服务器端不需要专门写时间生成脚本。
过程分析:
1.从服务器读到一个时间戳之后便开始计时,不考虑网络传输的耗时:
图中的各项标注分别是(上面的时间线采用标准时间,与服务器和页面的时间均无关):
start——页面项服务器发起AJAX请求时的时间。
www_start——服务器响应页面的请求并返回时间戳给页面的时间。
pc_start——页面接受到服务器返回的时间戳并开始计时的时间。
www_end——服务器倒计时结束的时间。
pc_end——页面倒计时结束的时间,同时也是用户在倒计时结束那一刻点击按钮的时间。
end——服务器接收到用户点击信息的时间。
可以看出,即使在倒计时结束的那一刻(也就是秒杀开始那一刻)用户就立即点击鼠标,也会比实际开始抢拍的时间(www_end,即服务器
倒计时结束的时间)晚一些(可以很容易的看出,这个时间差正好等于pc_start - start,也就是AJAX从开始发送到接收到响应信息的耗
时)。如果有些内行在页面倒计时结束前用脚本发送请求,那么其他用户可就亏大了。所以,我们要解决掉这个时间误差的问题。
2.为了解决时间误差的问题,我们将把页面倒计时的时间缩短一小截(由上面的分析可以得出,这一小截正好等于pc_start - start),使得
用户在倒计时结束时发送给服务器的抢拍信息正好在服务器倒计时结束时被接收到:
图中的各项标注与Pic.1中相同(时间线采用标准时间,与服务器和页面的时间均无关),新增的两项标注的含义如下:
old_pc_end——在未对网络传输耗时进行处理的情况下pc_end的时间。
old_end——在未对网络传输耗时进行处理的情况下end的时间。
由Pic.2可见,网络传输耗时造成的时间误差已经完全被弥补了,弥补的方法是“将倒计时结束的时间提前pc_start - start”。但是解决了网络传
输耗时造成的误差问题,还有用户电脑时间和服务器时间不相同的问题,下面我们继续讨论。
3.用户的电脑时间和服务器时间一定是有差异的,甚至差几个时区,怎么解决这个问题呢?方法的要点如下:
A. 当页面接收到服务器返回的时间戳www_t时,立即开始计时。
B. 当页面接收到服务器返回的时间戳www_t时,立即计算本地时间和服务器返回的时间戳的时间差t=new Date().getTime() - www_t*1000。
C. 仍然使用new Date().getTime()来计时,而不是使用setInterval()函数(计时器很不稳定,误差也很大),但时间的显示与程序的逻辑必须
基于本地时间和上一步(B中)求得的时间偏差t。
结论要点:
页面从接收到服务器响应的时间戳开始计时,计时的时长应减掉AJAX从发送到接收整个过程的耗时,计时过程则使用本地时间来实现(本
地时间+时间偏差)。
有任何疑问或建议请留言,谢谢!
原作者:微米博客
分享到:
相关推荐
由于秒杀涉及的时间和服务器时间的同步对于确保活动的公平性和准确性至关重要,因此,如何使用JavaScript实现与服务器时间同步的商品秒杀倒计时成为了本篇讨论的核心内容。 首先,需要明确在实现秒杀倒计时时应避免...
在Vue.js中实现一个秒杀倒计时组件,主要涉及到前端与后端时间同步、定时器的使用以及时间格式化等多个知识点。以下是对这些技术点的详细解释: 1. **前端与后端时间同步**: - 在进行秒杀倒计时前,必须确保前端...
为了确保倒计时的准确性,前端需要定期与服务器同步时间信息。这可以通过发送Ajax请求实现,如使用`fetch`或`XMLHttpRequest`。当服务器返回最新的结束时间,前端根据这个时间进行倒计时。 六、性能优化 1. 避免...
- API接口:与后端通信获取倒计时开始时间和结束时间,可能需要通过RESTful API或者WebSocket实现实时更新。 - 数据格式:通常以Unix时间戳或者ISO 8601格式传递时间信息,便于前后端处理。 4. **性能优化**: -...
在本文中,我们将探讨如何使用JavaScript技术来同步服务器时间,并实现一个同步倒计时功能。这一技术常用于需要时间同步的Web应用中,例如秒杀活动、定时活动、在线考试系统等。 首先,我们来看一下同步服务器时间...
JavaScript 实现限时秒杀功能是在线购物平台常见的一种促销手段,通过倒计时的方式...需要注意的是,这只是基本的实现,实际应用中可能需要考虑更多因素,如服务器时间同步、用户界面的交互反馈以及与后端数据交互等。
此外,文章还提到了其他一些JavaScript倒计时的实现方式,如在几秒后跳转、与服务器时间同步的商品秒杀倒计时等。这些实现通常涉及到更复杂的逻辑,例如处理时区差异、网络延迟以及用户交互。但基本的倒计时逻辑与...
2. 时间控制:秒杀活动的开始时间和结束时间需要从父组件传入,并且在组件创建时同步服务器时间与倒计时结束时间的差值,并在此基础上设置一个定时器,每秒钟对秒杀状态进行判断。 3. 动态控制:通过计算属性...
本文将围绕“秒杀功能js-自定义时间(可不为整点)”这一主题,深入探讨如何使用JavaScript实现一个灵活的、非整点时间轮巡的秒杀系统。 首先,我们需要理解秒杀系统的本质:在特定时间内,对有限的商品进行限时...
7. **AJAX交互**:虽然描述中没有明确提及,但若要实现真正的每日秒杀,代码可能涉及AJAX请求以获取服务器上的最新倒计时时间,确保不同用户看到的时间同步。 8. **性能优化**:使用`requestAnimationFrame`或`...
在构建一个商品秒杀系统时,常常需要实现一个实时倒计时的功能,确保用户界面的计时与服务器时间保持一致,防止用户通过篡改本地时间来作弊。本篇将介绍如何利用PHP和JavaScript来实现这样的类商品秒杀计时器。 ...
4. **计时器**:在竞拍过程中,计时器至关重要,用于显示剩余时间,确保公平公正。 5. **支付接口**:竞拍成功后,需要集成支付接口,如支付宝、微信支付,方便用户完成交易。 6. **通知系统**:当用户出价被超越...
3. **JavaScript 动态功能**:JavaScript负责页面的交互功能,如倒计时、库存实时更新、加入购物车、提交订单等。这些功能提高了用户体验,增强了秒杀活动的紧迫感。 4. **Ajax 技术**:Ajax(Asynchronous ...
- 后端接口交互:与服务器进行实时通信,获取秒杀状态、更新库存等信息。 4. 数据存储与同步: - **本地存储**:小程序提供wx.setStorageSync和wx.getStorageSync接口,用于在本地缓存数据,如用户的登录状态、...
同时可以通过JavaScript实现前端的秒杀倒计时功能,提高用户体验。 - **后端服务**:采用PHP+MySQL+Redis技术栈。其中,PHP负责业务逻辑处理;MySQL作为持久化存储,主要用于存储用户信息、订单信息等;Redis用于...