业务风险:
对于一些秒杀、签到、以时间为尺度做任务的业务需求对于时间的保真行和准确性要求非常的高。但是客户端的系统时间能够被用户修改,因而通过之前普通的方式进行时间的获取会存在很大风险。
因此我们要做一些措施来防止拿到的数据是被恶意修改的时间,减少对业务的损害。
思路:系统启动后到当前的时间间隔是无法被外界修改的,因此我们可以把这个时间和服务器拿到的时间作为准确的时间来计算要上传到服务端的时间
uptime:系统重启后到目前为止的时间间隔,这个时间级别是内核时间。
1.先拿到服务器时间T0,此刻也取到当前的uptimeT1
2.在要使用时间时,获取当前的uptimeT2,则T2-T1就是最准确的时间间隔,则与服务器时间对应的时间应该是T0 + T2-T1
这样我们拿到的时间T0 + T2-T1 应该算得上是非常准确的数据了。
获取uptime
//uptimeh获取系统重启后的至今运行的时间
func uptime() ->time_t {
var boottime =timeval()
var mib: [Int32] = [CTL_KERN, KERN_BOOTTIME]
var size =MemoryLayout.stride(ofValue:timeval())
var now =time_t()
var uptime:time_t=-1
time(&now)
if(sysctl(&mib,2, &boottime, &size,nil,0) !=-1 && boottime.tv_sec!=0) {
uptime = now - boottime.tv_sec
}
return uptime
}