时间
- GMT:格林尼治时间
理论上讲,格林尼治时间的正午是太阳横穿格林尼治子午线的时间,作为世界各地区交流的的标准时间使用。由于地球转速改变,导致GMT不再作为标准时间使用 - UTC:协调世界时,由原子钟提供,作为现在的标准时间使用。
iOS时间相关
-
NSDate
以UTC为参考,代表从2001年1月1号00:00:00到当前时刻的时间间隔。
注意:NSDate
是独立于时区和任何日历系统的。只是代表了想退与参考时间的一个不可变的时间间隔。因此,统一日期的东八区的北京时间上午十点与东九区的东京时间上午十一点是一样的,timeInterval
值相等
NSDate objects encapsulate a single point in time, independent of any particular calendrical system or time zone. Date objects are immutable, representing an invariant time interval relative to an absolute reference date (00:00:00 UTC on 1 January 2001).
编程语言描述时间时,通常都是以一个时间点为参考时间,加上时间的偏移量,得到另一个时间点
//[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);
}
获取今天零点(或某一时刻)的 Date
private func getTodayDate() -> Date {
let currentCalendar = Calendar.current
let components = currentCalendar.dateComponents([.year, .month, .day], from: Date())
if let todayDate = currentCalendar.date(from: components) {// 今天零点的时间
let sevenPast30 = todayDate.timeIntervalSince1970 + 7.5 * 60 * 60 // 今天七点半的时间
let startDate = Date.init(timeIntervalSince1970: sevenPast30)
return startDate
}
return Date()
}