假设我有以下代码初始化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];
这两种方法有区别吗?如果是这样,应该使用哪一个以及为什么?
答案 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属性来修复它。