系统显示的时间和插件显示的时间,不知道为什么总有点差,有时候居然差1秒。理论上应该是同步才对。
因为对于这种到点自动购物的软件,如果连时间都抓不准,那这个软件也没什么用途了!
再细研究,发现一个细节:
就是,用户点击自动购物的时间一般都不是整秒!而界面自动显示的时间是整秒显示,如果代码的定时器(setInterval)的开始时间没把握好,肯定会有时间差的!
这个时间差一般在1秒之内。不过对于严谨性来说是差异蛮大了!要尽量将这个差异缩小!
针对这点,我的解决办法是:
在界面显示系统时间的时候,先根据用户点击的毫秒时间(用户肯定是某个毫秒时间点击功能的),找出隔下一秒的毫秒差,然后再设定一个定时器(setTimeout),下一整秒的时候才显示系统时间!
用了这个逻辑之后,基本上,功能显示的系统时间,和电脑的时间是可以对应起来了,基本是同步。
而秒杀的倒计时的显示也是差不多这个逻辑,反正原则上要做到的是:系统时间是多少,就显示多少,一秒不多,一秒也不可以少!
上面说的这些都可以在代码中看到。
附上一个代码,就是格式化时间的,很有用,网上找到的,特意分享一下:
// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}