受系统时间影响的方式

受系统时间影响,表示用户修改设备时间这些获取时间方式返回的值会发生变化

1、NSDate

该函数返回的时间以UTC为基准,它描述的是时间线上的某个绝对值,例如[NSDate date]表示当前时间距离UTC 2001年一月一日00:00:00过了多长时间。NSDate和市区和文化无关,如果要展示具体格式的时间,需要NSDateFormatterNSTimeZone的辅助

2、CFAbsoluteTimeGetCurrent()

该函数返回的时间以GMT为标准的,2001年一月一日00:00:00这一刻的时间绝对值

GMT时间(Greenwich Mean Time),格林治时间,人们最开始以太阳在一天当中所处的位置来描述当前的时间。但不同地区太阳的位置不同,所以需要有一个公共的地方,以这个地方的太阳的位置来做参考着。最后选择的是英国伦敦的格林尼治天文台所在地,以格林尼治的时间作为公共时间,也就是我们所说的GMT时间。

UTC(Coordinated Universal Time ),原子钟50亿年才会误差1秒,这种精读已经远胜于GMT了,所以称以这种原子钟来衡量时间的变化称为UTC时间

3、gettimeofday()

获取当前的Unix time值,表示当前时间距离UTC 1070年1月1号00:00:00过了多少秒 ,(Unix time是以UTC 1970年1月1号00:00:00为基准时间),受系统时间影响,系统时间改变,该值也会变

struct timeval now;
struct timezone tz;
gettimeofday(&now, &tz);
4、sysctl

利用sysctl来获取系统内核返回的设备重启之后运行的时间,受系统时间影响,系统时间改变,该值也会变

#include <sys/sysctl.h>

- (long)bootTime
{
#define MIB_SIZE 2
    int mib[MIB_SIZE];
    size_t size;
    struct timeval  boottime;
    
    mib[0] = CTL_KERN;
    mib[1] = KERN_BOOTTIME;
    size = sizeof(boottime);
    if (sysctl(mib, MIB_SIZE, &boottime, &size, NULL, 0) != -1)
    {
        return boottime.tv_sec;
    }
    return 0;
}
受设备重启影响的方式

用户修改设备时间这些获取时间方式返回的值不会发生变化,但是设备重启和休眠会影响

1、mach_absolute_time()

表示 CPU 的时钟周期数(ticks),一般很少用,单位是uint64_t,但经过转换其精确度可以达到纳秒(ns),它不受系统时间影响,只受设备重启和休眠行为影响,重启手机mach_absolute_time()函数会重新计数。

2、CACurrentMediaTime()

属于QuartzCore,其单位是CFTimeInterval,是对mach_absolute_time()的封装,并且转化为不受系统时间影响,只受设备重启和休眠行为影响,重启手机重新计数。

#####3、NSProcessInfo

NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];

`