1、NSDate是我们很常用的一种时间类,它是什么?
NSDate与NSData是很像的,一不注意就容易搞错,这两个类完全是指两个不同的对象。NSDate指的是时间,比如通过这个类,我们可以获取当前时间,从现在开始之后多少时间会做什么事,等等,都是通过它来完成的。NSData是数据,指二进制数据。
2、NSDate的基本应用
//NSDate对象的基本常识
now (当前时间点)
相对于1 January 2001, GMT的时间点
相对于1970的时间点
distantFuture (不可达到的未来的某个时间点) distantPast (不可达到的过去的某个时间点
// 相对于已知的某个时间点
- (id) initWithTimeInterval:(NSTimeInterval) secsToBeAdded
sinceDate:(NSDate *) anotherDate;
// 相对于当前时间
- (id) initWithTimeIntervalSinceNow:(NSTimeInterval) secsToBeAdded;
// 相对于1970年1月1日0时0分0秒
- (id) initWithTimeIntervalSince1970:(NSTimeInterval)seconds;
// 相对于2001年1月1日0时0分0秒
- (id) initWithTimeIntervalSinceReferenceDate:(NSTimeInterval) secs;
// iOS中NSDate最常用的方法:
NSDate *now = [NSDate date]; // [[NSDate alloc] init]
NSDate *dateFromNow = [NSDate dateWithTimeIntervalSinceNow:60];
NSDate *dateFromAnotherDate = [[NSDate alloc] initWithTimeInterval:60 sinceDate:dateFromNow];
NSTimeInterval timeInterval1 = [now timeIntervalSinceDate:dateFromNow];
NSTimeInterval timeInterval2 = [now timeIntervalSinceNow];
//-------------------------------------------------------------
NSDate *distantPast = [NSDate distantPast]; // 可以表示的最早的时间
NSDate *distantFuture = [NSDate distantFuture]; // 可以表示的最远的未来时间
NSString *stringDate = @"12/31/9999";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"MM/dd/yyyy"];
NSDate *dateCheck = [dateFormatter dateFromString:stringDate];
NSLog(@"Date = %@", dateCheck);
Output:
Date = 1999-12-30 16:00:00 +0000
*iOS中用NSDate表示的时间只能在distantPast和distantFuture之间!
//-------------------------------------------------------------
3、什么是NSCalendar?
NSCalendar是什么类呢,简而言之就是日历类,用来表示日历的对象。
4、NSCalendar的简单应用
// 当前时间对应的月份中有几天
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;
// 当前时间对应的月份中有几周(前面说到的firstWeekday会影响到这个结果)
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length;
// 当前时间对应的周是当前年中的第几周
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfYearCalendarUnit inUnit:NSYearCalendarUnit forDate:self]; [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]];
// 当前时间对应的周是当前月中的第几周
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfMonthCalendarUnit inUnit:NSYearCalendarUnit forDate:self]; [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];
5、什么是NSDateComponents?
NSDateComponents将时间表示成适合人类阅读和使用的方式,通过NSDateComponents可以快速而简单地获取某个时间点对应的“年”,“月”,“日”,“时”,“分”,“秒”,“周”等信息。当然一旦涉及了年月日时分秒就要和某个历法绑定,因此NSDateComponents必须和NSCalendar一起使用,默认为公历。
6、NSDateComponents的应用
// 第一种方式
// 先定义一个遵循某个历法的日历对象
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// 通过已定义的日历对象,获取某个时间点的
NSDateComponents表示,并设置需要表示哪些信息(NSYearCalendarUnit, NSMonthCalendarUnit, NSDayCalendarUnit等)NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit fromDate:[NSDate date]];
NSLog(@"year(年份): %i", dateComponents.year);
NSLog(@"quarter(季度):%i", dateComponents.quarter);
NSLog(@"month(月份):%i", dateComponents.month);
NSLog(@"day(日期):%i", dateComponents.day);
NSLog(@"hour(小时):%i", dateComponents.hour);
NSLog(@"minute(分钟):%i", dateComponents.minute);
NSLog(@"second(秒):%i", dateComponents.second);// Sunday:1, Monday:2, Tuesday:3, Wednesday:4, Friday:5, Saturday:6NSLog(@"weekday(星期):%i", dateComponents.weekday);// 苹果官方不推荐使用weekNSLog(@"week(该年第几周):%i", dateComponents.week);NSLog(@"weekOfYear(该年第几周):%i", dateComponents.weekOfYear);NSLog(@"weekOfMonth(该月第几周):%i", dateComponents.weekOfMonth);
// 第二种方式
// 先定义一个遵循某个历法的日历对象
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// 定义一个NSDateComponents对象,设置一个时间点
NSDateComponents *dateComponentsForDate = [[NSDateComponents alloc] init];[dateComponentsForDate setDay:6];[dateComponentsForDate setMonth:5];[dateComponentsForDate setYear:2004];
// 根据设置的dateComponentsForDate获取历法中与之对应的时间点
// 这里的时分秒会使用NSDateComponents中规定的默认数值,一般为0或1。NSDate *dateFromDateComponentsForDate = [greCalendar dateFromComponents:dc];
// 定义一个NSDateComponents对象,设置一个时间段
NSDateComponents *dateComponentsAsTimeQantum = [[NSDateComponents alloc] init];[dateComponentsForDate setDay:6];
// 在当前历法下,获取6天后的时间点
NSDate *dateFromDateComponentsAsTimeQantum = [greCalendar dateByAddingComponents:dateComponentsAsTimeQantum toDate:[NSDate date] options:0];
// 第三种方式
// 先定义一个遵循某个历法的日历对象
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// 根据两个时间点,定义NSDateComponents对象,从而获取这两个时间点的时差
NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit fromDate:[NSDate dateWithTimeIntervalSince1970:0] toDate:[NSDate date] options:0];
NSLog(@"number of years:%i", dateComponents.year);
// 重点参考了一下文章
http://my.oschina.net/yongbin45/blog/156181?fromerr=oC6C7zZR