一、概述
- GMT:Greenwich Mean Time缩写,表示格林尼治的时间基准。
- UTC:Coordinated Universal Time 缩写,表示原子钟时间基准。
二、iOS的各种时间api区别
2.1、第一种受系统时间影响,可能会被用户修改
-
NSDate
,以UTC为标准,和时区和文化无关。 -
CFAbsoluteTimeGetCurrent()
,以GMT为标准,等同于[[NSDate date] timeIntervalSinceReferenceDate]
。 -
gettimeofday
,获取的是Unix time(是以UTC为基准时间,当前时间距离基准点偏移的秒数)。 -
sysctl
,可获取上次设备重启的Unix time时间。
2.2、第二种不受系统时间影响,与CPU计数有关
-
mach_absolute_time()
,CPU已经运行的tick的数量,可达到纳秒级的精度。
在每次手机重启之后,会重新开始计数;且iPhone锁屏进入休眠之后tick也会暂停计数。 -
CACurrentMediaTime()
,内部使用mach_absolute_time()
并转化成秒,只受设备重启和休眠影响。
/* Returns the current CoreAnimation absolute time. This is the result of
* calling mach_absolute_time () and converting the units to seconds. */
CA_EXTERN CFTimeInterval CACurrentMediaTime (void)
三、使用场景
1、显示当前系统时间
一般使用NSDate即可,结合NSDateFormatter转化为不同显示格式的时间。
2、代码执行时间测量
主要考虑两个要求:1、精读要高;2、API本身几乎不耗CPU时间。
基于上面两点,更合适的选择是mach_absolute_time()
,精度到毫秒即可 。
3、客户端和服务器的时间同步
-
常用算法:
currSvrTime = lastSvrTime + (currlocalTime - lastLocalTime)
应用本地时间的获取,可以选择不受用户修改影响的mach_absolute_time()
或者CACurrentMediaTime()
。注意:另种一种本地时间算法(待验证)
image.png
网友评论