• 0
  • 0

uniapp 开发本地时间错乱处理

2019-09-12 78 0 admin 所属分类:LAYUI

有些时候本地如APP客户端的当前时间与服务器时间严重不符合, 会导致诸如限时抢单、倒计时计算等场景出问题  。同样限制60秒,有的客户端可以轻松绕过限制。这就变相造成一种使用不公的现象。因此需要做规避。

采用的做法是服务器新开接口返回最新时间戳,然后与客户端的当前时间戳对比,计算客户端是相对于服务器慢还是快。从而纠正时间错位。

/**
 * 本地和服务器比较 同步服务器时间戳
 */
sync_server_timestamp() {
    this.post('common', 'timestamp', {}, (res) = > {
        var finish_timestamp = this.timestamp(true);
        if (res.status == 1) {
            var server_timestamp = parseInt(res.data);
            console.log("当前服务器时间:", server_timestamp);
            console.log("当前本地时间:", finish_timestamp);
            common.time_diff = finish_timestamp - server_timestamp;
            console.log("本地与服务器时间差:", common.time_diff);
        }
    });
}

初始化time_diff为一个很大值 如果大于0 说明本地时间比较快

计算出实际的时间差  此处为延迟操作

var timestamp = api.timestamp(true);
//检测是否为顺路单
console.log("本地与服务器时间差:", this.g.time_diff);
var rest_sec = 0;
if (this.g.time_diff > -9999) {
    //转换为服务器时间的比较
    rest_sec = order.stopped_at - (timestamp - this.g.time_diff);
} else {
    rest_sec = order.stopped_at - timestamp;
}

演示倒计时操作

//检测是否需要延迟显示
if (this.g.setting.take_order_downcount > 0) {
    this.g.setting.take_order_downcount = parseInt(this.g.setting.take_order_downcount);
    var take_order_downcount = 0;
    if (this.g.time_diff > -9999) {
        //转换为服务器时间的比较
        take_order_downcount = this.g.setting.take_order_downcount - ((timestamp - this.g.time_diff) - order.pay_time);
    } else {
        fun.tips('请校对本地时间');
        return false;
    }
    if (take_order_downcount > 0) {
        order.take_order_downcount = take_order_downcount;
    } else {
        order.take_order_downcount = 0;
    }
} else {
    //不开启倒计时
    order.take_order_downcount = 0;
}

为了避免有人修改本地时间恶意操作,需要在APP   App.vue 文件的应用生命周期的 onHide 和 onShow 做处理 及时同步时间 保证应用每一次切换状态都会及时更新内容

返回顶部