关于时间

时间的形式:时间是线性的

时间是线性的,即任意一个时刻,这个地球上只有一个绝对时间值存在,只不过因为时区或者文化的差异,处于同一时空的我们对同一时间的表述或者理解不同。

GMT

前人发现抬头看太阳是个好办法,太阳总是按规律的“早起晚落”,而且“亘古不变”,可以用太阳在一天当中所处的位置来描述当前的时间。后来不同地区的文化需要交流,你这里太阳正高空照,我这可能已经下山了,所以需要有一个公共的大家都认可的地方,以这个地方太阳的位置来做参考着,沟通起来就会方便很多。最后选择的是英国伦敦的格林尼治天文台所在地,以格林尼治的时间作为公共时间,也就是我们所说的GMT时间(Greenwich Mean Time)。

UTC

太阳所处的位置变化跟地球的自转相关,过去人们认为地球自转的速率是恒定的,但在1960年这一认知被推翻了,人们发现地球自转的速率正变得越来越慢,而时间前进的速率还是恒定的,所以GMT不再被认为可以用来精准的描述时间了。

我们需要继续寻找一个匀速前进的值。抬头看天是我们从宏观方向去寻找答案,科技的发展让我们在微观方面取得了更深的认识,于是有聪明人根据微观粒子原子的物理属性,建立了原子钟,以这种原子钟来衡量时间的变化,原子钟50亿年才会误差1秒,这种精读已经远胜于GMT了。这个原子钟所反映的时间,也就是我们现在所使用的UTC(Coordinated Universal Time )标准时间。

常用时间获取方式

在iOS中,常用的获取时间方法有以下几种:

  • NSDate
  • Unix time
  • CFAbsoluteTimeGetCurrent()
  • CACurrentMediaTime()

其中NSDate和CFAbsoluteTimeGetCurrent()都会同步网络时间,但是并不可靠,可能被用户修改。CACurrentMediaTime()和系统时间无关,常用于性能测试统计等。


NSDate

NSDate对象描述的是时间线上的一个绝对的值,和时区和文化无关,它参考的值是:以UTC为标准的,2001年1月1日00:00:00这一刻的时间绝对值。

// 当前时间
[NSDate date];

// 当前时间距离参考时间2001年1月1日00:00:00的偏移量
[[NSDate date] timeIntervalSinceReferenceDate];

注意:NSDate是受手机系统时间控制的,并不可靠,用户可能修改时间。


Unix time

Unix time是以UTC 1970年1月1号 00:00:00为基准时间,当前时间距离基准点偏移的秒数。

通过NSDate的API可以获取:

[[NSDate date] timeIntervalSince1970];

我们和服务器通讯的时候一般使用Unix time。


CFAbsoluteTimeGetCurrent()

CFAbsoluteTimeGetCurrent()的概念和NSDate非常相似,只不过参考点是:以GMT为标准的,2001年1月1日00:00:00这一刻的时间绝对值。

double absTime = CFAbsoluteTimeGetCurrent();

CACurrentMediaTime()

double mediaTime = CACurrentMediaTime();

CACurrentMediaTime()不会受系统时间影响,只受设备重启和休眠行为影响。

所以常用于做BenchMark(基准)测试、性能测试。