美文网首页
时间 iOS

时间 iOS

作者: c42b9af86268 | 来源:发表于2016-12-16 09:41 被阅读0次

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

    相关文章

      网友评论

          本文标题:时间 iOS

          本文链接:https://www.haomeiwen.com/subject/gphnmttx.html