受系统时间影响的方式
受系统时间影响,表示用户修改设备时间这些获取时间方式返回的值会发生变化
1、NSDate
该函数返回的时间以UTC为基准,它描述的是时间线上的某个绝对值,例如[NSDate date]
表示当前时间距离UTC 2001年一月一日00:00:00过了多长时间。NSDate和市区和文化无关,如果要展示具体格式的时间,需要NSDateFormatter
和NSTimeZone
的辅助
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];
`