NSDate

    NSDate类用于保存时间值,同时提供了一些方法来处理一些基于秒级别时差(Time Interval)运算和日期之间的早晚比较等。

用于创建NSDate实例的类方法有:

+ (id)date;
返回当前时间

+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;   
返回以当前时间为基准,然后过了secs秒的时间

+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs;
返回以2001/01/01 GMT为基准,然后过了secs秒的时间

+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
返回以1970/01/01 GMT为基准,然后过了secs秒的时间

+ (id)distantFuture;
返回很多年以后的未来的某一天。
比如你需要一个比现在(Now)晚(大)很长时间的时间值,
则可以调用该方法。测试返回了4000/12/31 16:00:00

+ (id)distantPast;
返回很多年以前的某一天。
比如你需要一个比现在(Now)早(小)大很长时间的时间值,
则可以调用该方法。测试返回了公元前0001/12/31 17:00:00

用于创建NSDate实例的实例方法有
- (id)addTimeInterval:(NSTimeInterval)secs;
返回以目前的实例中保存的时间为基准,然后过了secs秒的时间

用于初始化NSDate实例的实例方法有
- (id)init;
初始化为当前时间。类似date方法

- (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs;
初始化为以2001/01/01 GMT为基准,然后过了secs秒的时间。
类似dateWithTimeIntervalSinceReferenceDate:方法

- (id)initWithTimeInterval:(NSTimeInterval)secs sinceDate:(NSDate *)refDate;
初始化为以refDate为基准,然后过了secs秒的时间

- (id)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;
初始化为以当前时间为基准,然后过了secs秒的时间

日期之间比较,可用以下方法:

- (BOOL)isEqualToDate:(NSDate *)otherDate;
与otherDate比较,相同返回YES

- (NSDate *)earlierDate:(NSDate *)anotherDate;
与anotherDate比较,返回较早的那个日期

- (NSDate *)laterDate:(NSDate *)anotherDate;
与anotherDate比较,返回较晚的那个日期

- (NSComparisonResult)compare:(NSDate *)other;
该方法用于排序时调用:
. 当实例保存的日期值与anotherDate相同时返回NSOrderedSame
. 当实例保存的日期值晚于anotherDate时返回NSOrderedDescending
. 当实例保存的日期值早于anotherDate时返回NSOrderedAscending

时间间隔,可用以下方法:

- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)refDate;
以refDate为基准时间,返回实例保存的时间与refDate的时间间隔

- (NSTimeInterval)timeIntervalSinceNow;
以当前时间(Now)为基准时间,返回实例保存的时间与当前时间(Now)的时间间隔

- (NSTimeInterval)timeIntervalSince1970;
以1970/01/01 GMT为基准时间,返回实例保存的时间与1970/01/01 GMT的时间间隔

- (NSTimeInterval)timeIntervalSinceReferenceDate;
以2001/01/01 GMT为基准时间,返回实例保存的时间与2001/01/01 GMT的时间间隔

NSDate总结如下: 1 NSDate对象用来表示一个具体的时间点。 2 NSDate是一个类簇,我们所使用的NSDate对象,都是NSDate的私有子类的实体。 3 NSDate存储的是GMT时间(格林尼治标准时间Greenwich MeanTime),使用的时候会根据当前应用指定的时区进行时间上的增减,以供计算或显示。

参考: [iOS时间那点事--NSDate]https://my.oschina.net/yongbin45/blog/150114


NSTimeInterval

    NSTimeInterval的单位是秒。可以通过NSTimeInterval计算出时,分,秒。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *date1 = [formatter dateFromString:startTime];
NSDate *date2 = [NSDate date];
NSTimeInterval aTimer = [date2 timeIntervalSinceDate:date1];

int hour = (int)(aTimer/3600);
int minute = (int)(aTimer - hour*3600)/60;
int second = aTimer - hour*3600 - minute*60;
NSString *dural = [NSString stringWithFormat:@"%d时%d分%d秒", hour, minute,second];

    NSTimeInterval经常使用的场景就是时间戳。对于将NSDate类型转换为时间戳,是 10位的数值,这个数值在转化为 NSDate类型的时候,就会出点儿错,你会发现,每一个时间的 毫秒都是为000的;

    是因为 [[NSDate date] timeIntervalSince1970] 虽然可以获取到后面的毫秒、微秒 ,但是在保存的时候省略掉了。如一个时间戳不省略的情况下为 1395399556.862046 ,省略掉后为一般所见 1395399556 。所以想取得毫秒时用获取到的时间戳 *1000 ,想取得微秒时 用取到的时间戳 * 1000 * 1000 。这样就解释了上面的10位数值的问题,当你取毫秒的时候,就会变成13位数值了。

//将时间戳转换为NSDate类型
-(NSDate *)getDateTimeFromMilliSeconds:(long long) miliSeconds
{
    NSTimeInterval tempMilli = miliSeconds;
    NSTimeInterval seconds = tempMilli/1000.0;//这里的.0一定要加上,不然除下来的数据会被截断导致时间不一致
    NSLog(@"传入的时间戳=%f",seconds);
    return [NSDate dateWithTimeIntervalSince1970:seconds];
}

//将NSDate类型的时间转换为时间戳,从1970/1/1开始
-(long long)getDateTimeTOMilliSeconds:(NSDate *)datetime
{
    NSTimeInterval interval = [datetime timeIntervalSince1970];
    NSLog(@"转换的时间戳=%f",interval);
    long long totalMilliseconds = interval*1000 ;
    NSLog(@"totalMilliseconds=%llu",totalMilliseconds);
    return totalMilliseconds;
}

参考: [ios NSTimeInterval获取时间间隔]http://blog.csdn.net/so_much/article/details/8979186 [iOS 将时间NSDate转化为毫秒时间戳]http://longlinyisheng.lofter.com/post/3ca1cc_59c458a


NSDateFormatter

    NSDateFormatter是NSFormatter的子类,另,NSFormatter的用途是“将数据在字符串与特定类型的对象之间转换”,目前NSFormatter只有两个子类NSNumberFormatter和NSDateFormatter。

// NSDate --> NSString
NSDate *now = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // yyyy 年
    // MM 月
    // dd 日
    // HH 24小时  hh 12小时
    // mm 分钟
    // ss 秒钟
    // Z 时区
formatter.dateFormat = @"yyyy年MM月dd日 HH时mm分ss秒 Z";
//formatter.dateFormat = @"MM-dd-yyyy HH-mm-ss";
NSString *res = [formatter stringFromDate:now];
NSLog(@"%@", res);

    尽管NSDateFormatter提供了许多已定义好的时间格式,但是开发中开发人员更加喜欢自定义时间格式。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"'公元前/后:'G  '年份:'u'='yyyy'='yy '季度:'q'='qqq'='qqqq '月份:'M'='MMM'='MMMM '今天是今年第几周:'w '今天是本月第几周:'W  '今天是今天第几天:'D '今天是本月第几天:'d '星期:'c'='ccc'='cccc '上午/下午:'a '小时:'h'='H '分钟:'m '秒:'s '毫秒:'SSS  '这一天已过多少毫秒:'A  '时区名称:'zzzz'='vvvv '时区编号:'Z "];
NSLog(@"%@", [dateFormatter stringFromDate:[NSDate date]]);

参考: [iOS时间那点事--NSDateFormatter]https://my.oschina.net/yongbin45/blog/150667


NSTimeZone

    时区是一个地理名字,是为了克服各个地区或国家之间在使用时间上的混乱。

基本概念:

NSDate *date = [NSDate date];
NSLog(@"当前时间 date = %@",date);
NSTimeZone *zone = [NSTimeZone systemTimeZone];
NSInteger interval = [zone secondsFromGMTForDate: date];
NSDate *localDate = [date  dateByAddingTimeInterval: interval];
NSLog(@"正确当前时间 localDate = %@",localDate);

参考: [iOS时间那点事--NSTimeZone]https://my.oschina.net/yongbin45/blog/151376 [ios NSDate NSTring long 时间戳与字符串转换]http://longquan.iteye.com/blog/1873268


NSCalendar

NSDate *createDate = [self getDateTimeFromMilliSeconds:1475128625025];

NSCalendar *cal = [NSCalendar currentCalendar];
NSString *key = NULL;
if ([cal isDateInToday: createDate]){
    key = @"今天";
}

if (!key && [cal isDateInYesterday: createDate]){
    key = @"昨天";
}

if (!key && [cal isDateInWeekend: createDate]){
    key = @"过去七天";
}

if (!key)    key = @"最近一个月";

NSLog(@"createDate=%@,key=%@",createDate, key);

参考:

[NSCalendar Additions]http://nshipster.cn/nscalendar-additions/ [NSCalendar + NSDateComponents]https://my.oschina.net/yongbin45/blog/156181