时间 iOS

转自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了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 场景 我们经常遇到这样的场景,比如电商类App到零点的时候开始抢购,比如商品限购倒计时等等。这种场景下需要我们将客...
    zhangbo1992阅读 10,188评论 10 39
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 7,272评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,714评论 19 139
  • 1.NSLog(@"%@",[[UIDevice currentDevice] systemVersion]);/...
    Y像梦一样自由阅读 13,639评论 3 12
  • 近年来无上班事,带孩子,成了生活的全部。的确单调,所以会追剧,颇爱古装,看了许多,武则天、甄嬛传、芈月传等等,都很...
    杨子今阅读 2,507评论 0 0