NSCalendar dateFromComponents:vs NSDateComponents日期

时间:2014-03-01 01:31:48

标签: objective-c nsdate nsdatecomponents

假设我有以下代码初始化NSDateComponents:

NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setYear:1987];
[components setMonth:3];
[components setDay:17];
[components setHour:14];
[components setMinute:20];
[components setSecond:0];

现在我想将组件转换为NSDate。似乎有两种方式:

方法1:

NSDate *date = [calendar dateFromComponents:components];

方法2:

NSDate *date = [components date];

这两种方法有区别吗?如果是这样,应该使用哪一个以及为什么?

2 个答案:

答案 0 :(得分:4)

NSDate *date = [components date];

相同

NSDate *date = [[components calendar] dateFromComponents:comps];

如果您没有为日期组件分配日历,则会返回nil。 您可以通过设置环境变量NSObjCMessageLoggingEnabled=YES来验证 在项目方案中,并在生成的消息跟踪(/tmp/msgSends-NNNN)中观察 调用完全相同的方法。

这意味着您可以致电

NSDate *date = [calendar dateFromComponents:components];

[components setCalendar:calendar];
NSDate *date = [components date];

两种方法之间没有区别

答案 1 :(得分:1)

我认为NSDateComponents默认情况下没有设置日历。因此,与特定日历(如格里高利)相关的问题未定义。

根据Apple的文档here

  

NSDateComponents的实例不负责回答有关超出初始化信息的日期的问题。例如,如果您在2004年5月6日初始化一个,它的工作日是NSUndefinedDateComponent,而不是星期四。要获得正确的星期几,您必须创建一个合适的NSCalendar实例,使用dateFromComponents创建一个NSDate对象:然后使用components:fromDate:来检索工作日 - 如下例所示。

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:6];
[comps setMonth:5];
[comps setYear:2004];
NSCalendar *gregorian = [[NSCalendar alloc]
    initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date = [gregorian dateFromComponents:comps];
[comps release];
NSDateComponents *weekdayComponents =
    [gregorian components:NSWeekdayCalendarUnit fromDate:date];
int weekday = [weekdayComponents weekday];

但我相信你可以设置NSDateComponent的Calendar属性来修复它。