时间 iOS

2016-12-16  本文已影响0人  c42b9af86268

转自http://mp.weixin.qq.com/s/cSZUNMuqk6DL3-nctyxzcw 部分文章。

我们做性能优化的时候,经常需要对某个方法执行的时间做记录,就必然会用到上面提到的一些获取时间的方法。

#define TICK  NSDate *startTime = [NSDate date]

#define TOCK  NSLog(@"Time Cost: %f", -[startTime timeIntervalSinceNow])

客户端和服务器之间的时间同步

思路:首先还是会依赖于接口和服务器时间做同步,每次同步记录一个serverTime(Unix time),同时记录当前客户端的时间值lastSyncLocalTime,到之后算本地时间的时候先取curLocalTime,算出偏移量,再加上serverTime就得出时间了:

uint64_t realLocalTime = 0;

if (serverTime != 0 && lastSyncLocalTime != 0) {

realLocalTime = serverTime + (curLocalTime - lastSyncLocalTime);

}else {

realLocalTime = [[NSDate date] timeIntervalSince1970]*1000;

}

如果从来没和服务器时间同步过,就只能取本地的系统时间了,这种情况几乎也没什么影响,说明客户端还没开始用过。

//get system uptime since last boot

- (NSTimeInterval)uptime

{

struct timeval boottime;

int mib[2] = {CTL_KERN, KERN_BOOTTIME};

size_t size = sizeof(boottime);

struct timeval now;

struct timezone tz;

gettimeofday(&now, &tz);

double uptime = -1;

if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)

{

uptime = now.tv_sec - boottime.tv_sec;

uptime += (double)(now.tv_usec - boottime.tv_usec) / 1000000.0;

}

return uptime;

}

gettimeofday和sysctl都会受系统时间影响,但他们二者做一个减法所得的值,就和系统时间无关了。这样就可以避免用户修改时间了。当然用户如果关机,过段时间再开机,会导致我们获取到的时间慢与服务器时间,真实场景中,慢于服务器时间往往影响较小,我们一般担心的是客户端时间快于服务器时间。

多和服务器做时间同步,再把关键的时间校验逻辑放在Server端,就不会出现什么意外的bug了。

上一篇下一篇

猜你喜欢

热点阅读