Objective c 增加日期的最有效方法

Objective c 增加日期的最有效方法,objective-c,nsdatecomponents,Objective C,Nsdatecomponents,我想在一个循环中增加天数,这样它就可以计数2012-11-10,2012-11-11,2012-11-12 实现这一目标最有效的方法是什么 NSDate *iterationDate = [NSDate date]; for (int i = 0; i < 100; i++) { NSDateComponents *comps = [[NSDateComponents alloc] init]; [comps setYear:0]; [comps setMonth

我想在一个循环中增加天数,这样它就可以计数
2012-11-10
2012-11-11
2012-11-12

实现这一目标最有效的方法是什么

NSDate *iterationDate = [NSDate date];

for (int i = 0; i < 100; i++) {
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setYear:0];
    [comps setMonth:0];
    [comps setWeek:0];
    [comps setDay:1];
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:0];
    iterationDate = [currentCalendar dateByAddingComponents:comps toDate:iterationDate options:0];
}
NSDate*迭代日期=[NSDate日期];
对于(int i=0;i<100;i++){
NSDateComponents*comps=[[NSDateComponents alloc]init];
[comps setYear:0];
[comps setMonth:0];
[薪酬设置周:0];
[薪酬设定日:1];
[comps设置小时:0];
[comps setMinute:0];
[补偿设置秒:0];
iterationDate=[currentCalendar dateByAddingComponents:comps toDate:iterationDate选项:0];
}

我认为您的方法不错,只是不要每次分配
NSDateComponents
对象(
comps
):

NSDate*迭代日期=[NSDate日期];
NSDateComponents*comps=[[NSDateComponents alloc]init];
[薪酬设定日:1];
对于(int i=0;i<100;i++)
iterationDate=[currentCalendar dateByAddingComponents:comps toDate:iterationDate选项:0];
另一种方法是(这应该更快,但需要测试…):

NSDate*迭代日期=[NSDate日期];
int daysToAdd=1;
对于(int i=0;i<100;i++)
iterationDate=[iterationDate addTimeInterval:60*60*24*daysToAdd];

如果您需要所有中间
NSDate
s,只需从循环中拉出
comps

NSDate *iterationDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:0];
[comps setMonth:0];
[comps setWeek:0];
[comps setDay:1];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];

for (int i = 0; i < 100; i++) {
    iterationDate = [currentCalendar dateByAddingComponents:comps toDate:iterationDate options:0];
}
NSDate*迭代日期=[NSDate日期];
NSDateComponents*comps=[[NSDateComponents alloc]init];
[comps setYear:0];
[comps setMonth:0];
[薪酬设置周:0];
[薪酬设定日:1];
[comps设置小时:0];
[comps setMinute:0];
[补偿设置秒:0];
对于(int i=0;i<100;i++){
iterationDate=[currentCalendar dateByAddingComponents:comps toDate:iterationDate选项:0];
}

您可以使用CoreFoundation API实现类似的功能:

CFCalendarRef calendar = CFCalendarCreateWithIdentifier(0, kCFGregorianCalendar);
CFAbsoluteTime at = CFAbsoluteTimeGetCurrent();
const CFOptionFlags options = 0;
for (int i = 0; i < NIter; ++i) {
    if (0 == CFCalendarAddComponents(calendar, &at, options, "d", 1)) {
        assert(0 && "uh-oh");
    }
    CFDateRef date = CFDateCreate(0, at);
    // store result
    CFRelease(date);
}
CFRelease(calendar);
CFCalendarRef calendar=CFCalendarCreateWithIdentifier(0,kCFGregorianCalendar);
CFAbsoluteTime at=CFAbsoluteTimeGetCurrent();
const CFOptionFlags options=0;
对于(int i=0;i

这比地基快33%。如果您不需要创建CFDates,只需存储
CFAbsoluteTime
值,则速度会更快。

如果第二种方法在日光节约之间存在过渡,那么它将不起作用,那么它是最有效的方法吗?因此,没有什么比添加组件的日期更快了?@swalkner yeah-CF是我尝试过的最快的,假设您需要使用API所需的所有细节(例如日历、区域设置、时区等);斯瓦尔克纳:有可能从时间上得到吗?是的
cf绝对时间
,与
NSTimeInterval
类似,使用
双精度
表示秒数。所以你只需要决定在哪里减法就可以得到你想要的结果。
NSDate *iterationDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:0];
[comps setMonth:0];
[comps setWeek:0];
[comps setDay:1];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];

for (int i = 0; i < 100; i++) {
    iterationDate = [currentCalendar dateByAddingComponents:comps toDate:iterationDate options:0];
}
CFCalendarRef calendar = CFCalendarCreateWithIdentifier(0, kCFGregorianCalendar);
CFAbsoluteTime at = CFAbsoluteTimeGetCurrent();
const CFOptionFlags options = 0;
for (int i = 0; i < NIter; ++i) {
    if (0 == CFCalendarAddComponents(calendar, &at, options, "d", 1)) {
        assert(0 && "uh-oh");
    }
    CFDateRef date = CFDateCreate(0, at);
    // store result
    CFRelease(date);
}
CFRelease(calendar);