
本文共 1596 字,大约阅读时间需要 5 分钟。
受系统时间影响的方式
某些方法获取时间信息会受到系统时间设置的影响。当设备的系统时间被人工修改时,这些方法返回的时间值也会相应改变。
1、NSDate
NSDate返回的是基于UTC时间的绝对时间值。这意味着它与时区无关,日期和时间描述的是UTC 2001年1月1日00:00:00以来经过的时间。由于NSDate本身不依赖于系统时区设置,要显示具体的时间格式,通常需要通过NSTimeZone和NSDateFormatter来添加时区信息进行格式化。
2、CFAbsoluteTimeGetCurrent()
CFAbsoluteTimeGetCurrent()返回的是基于GMT(格林尼治平均时间)的绝对时间值。GMT采用的是英国伦敦的格林尼治天文台时间,作为统一的标准参考时间。与UTC相比,GMT受地理环境的影响更大,而UTC则是基于精确的原子钟时间,误差极低。
GMT时间是基于英国伦敦的天文台,用于协调全球时间。但随着工具和技术的发展,基于原子钟的UTC时间已经取代了GMT作为更为精确和可靠的标准。
3、gettimeofday()
gettimeofday()函数返回的是当前时间的Unix time值,表示自1970年1月1日00:00:00 UTC以来经过的秒数。该值是基于UTC时间的,系统时间的改变直接影响到gettimeofday()函数返回的结果。
struct timeval now;struct timezone tz;gettimeofday(&now, &tz);
4、sysctl
sysctl命令可以用来获取系统内核的启动时间信息。这种信息也是基于系统时间设置的。当设备系统时间被修改时,sysctl返回的数据也会相应变化。
#include static int getBootTime() { struct mib mib; mib.name = CTL_KERN; mib.level = KERN_BOOTTIME; struct timeval bootTime; size_t size; if (sysctl(&mib, 1, &bootTime, &size, NULL, 0) == -1) { return 0; } return bootTime.tv_sec; }
受设备重启影响的方式
与系统时间修改不同,设备重启或进入休眠状态会对某些时间获取方法产生影响。
1、mach_absolute_time()
mach_absolute_time()函数返回的是基于CPU时钟周期的时间计数,单位是uint64_t。这个值反映的是设备的内部时钟周期数,通常很少被直接使用。但几乎所有的处理都是基于该函数的低层实现的,其精度可以达到纳秒(ns)级别。该方法不直接受系统时间设置的影响,而是受到设备是否处于休眠状态或已重启的限制。
2、CACurrentMediaTime()
CACurrentMediaTime()函数属于QuartzCore框架,其单位是CFTimeInterval,等价于从1970年1月1日以来的总时间。这一函数是mach_absolute_time()的封装版本,并将其结果转换为秒级表示。与CFAbsoluteTimeGetCurrent()类似,CACurrentMediaTime()的结果不直接受系统时间设置的影响,而是受到设备重启或者进入休眠状态的影响。
##### 3、NSProcessInfo
NSTimeInterval systemUptime = [[NSProcessInfo processInfo] systemUptime];
发表评论
最新留言
关于作者
