日历(NSCalendar)与日期组建(NSDateComponents)

之前介绍了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







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值