iOS时间相关
2018-01-05 本文已影响17人
NapoleonY
时间
- GMT:格林尼治时间
理论上讲,格林尼治时间的正午是太阳横穿格林尼治子午线的时间,作为世界各地区交流的的标准时间使用。由于地球转速改变,导致GMT不再作为标准时间使用 - UTC:协调世界时,由原子钟提供,作为现在的标准时间使用。
iOS时间相关
-
NSDate
以UTC为参考,代表从2001年1月1号00:00:00到当前时刻的时间间隔。编程语言描述时间时,通常都是以一个时间点为参考时间,加上时间的偏移量,得到另一个时间点//[NSDate date]获取本地当前时间 double time = [[NSDate date] timeIntervalSinceReferenceDate]; //537110663.983146秒, //537109844.576690/86400/365=17.031667年 //[[NSDate date] timeIntervalSince1970];
timeIntervalSinceReferenceDate
表示当前时刻相对于参考时间的时间间隔。上述代码中86400为1天的秒数,17刚好是从2001年到现在的年数。
要将NSDate
转换为具体的时间格式,需要借助于NSDateFormatter
和NSTimeZone
。-
NSDateFormatter
:NSDate
借助于NSDateFormatter
以特定的格式输出。 -
NSTimeZone
:计算某个地区的时间(上海/纽约等)
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"]; [dateFormatter setTimeZone:timeZone]; NSString *dateStr = [dateFormatter stringFromDate:[NSDate date]]; //2018-01-08 21:48:26
备注:
NSDate
受手机时间系统控制,即用户修改了手机的时间后,NSDate
的输出也会改变,因此NSDate
并不可靠 -
-
CFAbsoluteTimeGetCurrent()
类似于NSDate
,只不过参考时间为GMT 2001年1月1号 00:00:00,单位为秒
备注:CFAbsoluteTimeGetCurrent()
也受到手机时间系统控制,用户修改手机时间后,输出也会改变,也不可靠 -
mach_absolute_time()
返回CPU已经运行的时钟周期的数量,由于时钟周期是匀速变化的,因此可以将时钟周期转换为时间,秒、纳秒等。
备注:当手机重启,CPU的时钟周期会重置,手机休眠,时钟周期也会暂停计数。因此,mach_absolute_time()
不会受到系统时间影响,但是会受到手机的休眠或重启影响 -
CACurrentMediaTime()
将上面mach_absolute_time()
返回的时钟周期转换成秒数。#import <Quartz/Quartz.h> double timeNew = CACurrentMediaTime(); //20217.420085为设备开机到当前时刻的秒数,不包括中间设备休眠的时间
获取当前时间,精确到毫秒
- (void)getcurrentTimeMS {
NSDateFormatter *timeFormtter = [[NSDateFormatter alloc] init];
[timeFormtter setDateFormat:@"YYYY-MM-dd hh:mm:ss:SSS"];
NSString *dateNow = [timeFormtter stringFromDate:[NSDate date]];
NSString *timeNow = [[NSString alloc] initWithFormat:@"%@", dateNow];
NSLog(@"time:%@", timeNow);
}