之前介绍了NSDate的功能和用法,以及NSDate与NSString之间的相互转换,假设有如下场景:程序提供了三个输入框,让用户分别输入年,月,日的数值,接下来需要将年,月,日数值转换为NSDate;或者另外一个场景:得到一个NSDate对象之后,程序需要获取该NSDate中包含年号,月份,第几日的信息。这些都需要将NSDate对象都各个字段数据分开提取。
为了能分开处理NSDate对象所包含都各个字段的数据,Foundation框架提供了NSCalendar对象,该对象包括如下两个常用方法。
(NSDateComponents*)components:fromDate:从NSDate提取年,月,日,时,分,秒各个字段的信息
dateFromComponents:(NSDateComponents*) comps:使用comps对象包含的年,月,日,时,分,秒各个字段的信息来创建NSDate。
以上两个方法都用到来NSComponents对象,该对象专门用于封装年,月,日,时,分,秒各个字段的信息。该对象非常简单,它只包含year,month,date,day,hour,minute, second,week, weekday等各个字段等setter和getter方法。
从NSDate对象中分开获取各时间字段等数值步骤如下:]
1.创建NSCalendar对象
2.调用NSCalendar的components:fromDate:方法获取NSDate对象中各个时间字段的数值,该方法返回一个NSDateComponents对象。
3.调用NSDateComponents对象的getter方法来获取各个时间字段的数值。
使用各个时间字段的数值来初始化NSDate对象的步骤如下:
1.创建NSCalendar对象
2.创建一个NSDateComponents对象,调用该对象的setter方法来设置各个时间字段的值。
3.调用NSCalendar的dateFromComponents:(NSDateComponents*)初始化NSDate对象,该方法将返回一个NSDate对象。
具体可参考如下代码:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
//获取代表公历的Calendar对象
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//获取当前日期
NSDate* dt = [NSDate date];
unsigned unitFlags = NSYearCalendarUnit|NSMonthCalendarUnit|
NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|
NSSecondCalendarUnit|NSWeekdayCalendarUnit;
//获取不同时间字段的信息
NSDateComponents* comp = [gregorian components:unitFlags fromDate:dt];
//获取各个时间字段的数值
NSLog(@"现在是%ld年",comp.year);
NSLog(@"现在是%ld月",comp.month);
NSLog(@"现在是%ld日",comp.day);
NSLog(@"现在是%ld时",comp.hour);
NSLog(@"现在是%ld分",comp.minute);
NSLog(@"现在是%ld秒",comp.second);
NSLog(@"现在是星期%ld",comp.weekday);
//再次创建一个NSDateComponents对象
NSDateComponents* comp2 = [[NSDateComponents alloc] init];
//设置各个时间字段的数值
comp2.year = 2013;
comp2.month = 4;
comp2.day = 12;
comp2.hour = 15;
comp2.minute = 34;
//通过NSDateComponents所包含的时间字段的数值来恢复NSDateduixiang
NSDate* date = [gregorian dateFromComponents:comp2];
NSLog(@"获取的日期为:%@",date);
}
return 0;
}
打印日志如下:
2014-08-26 23:07:57.184 NSCalendarTest[533:303] 现在是2014年
2014-08-26 23:07:57.185 NSCalendarTest[533:303] 现在是8月
2014-08-26 23:07:57.185 NSCalendarTest[533:303] 现在是26日
2014-08-26 23:07:57.185 NSCalendarTest[533:303] 现在是23时
2014-08-26 23:07:57.186 NSCalendarTest[533:303] 现在是7分
2014-08-26 23:07:57.186 NSCalendarTest[533:303] 现在是57秒
2014-08-26 23:07:57.186 NSCalendarTest[533:303] 现在是星期3
2014-08-26 23:07:57.190 NSCalendarTest[533:303] 获取的日期为:2013-04-12 07:34:00 +0000