Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
388 views
in Technique[技术] by (71.8m points)

cocoa touch - Simplest way to loop between two NSDates on iPhone?

What's the simplest way to loop from one date to another?

What I want conceptually is something like this:

for (NSDate *date = [[startDate copy] autorelease]; [date compare: endDate] < 0;
     date = [date dateByAddingDays: 1]) {
    // do stuff here
}

This doesn't work, of course: there's no dateByAddingDays:. And even if it did, it would leave a wide trail of autoreleased objects waiting for their destruction.

Here's what I've thought of:

  • I can't just add an NSTimeInterval, since the number of seconds in a day can vary.
  • I could break it down into NSDateComponents and add one day to the components, then reassemble it. But that's long and ugly code.

So I'm hoping someone has tried a few options for this, and found a good one. Any ideas?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Set up a oneDay date component constant and repeatedly add it:

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *oneDay = [[NSDateComponents alloc] init];
    [oneDay setDay: 1];

    for (id date = [[startDate copy] autorelease]; [date compare: endDate] <= 0;
        date = [calendar dateByAddingComponents: oneDay
                                         toDate: date
                                        options: 0] ) {
        NSLog( @"%@ in [%@,%@]", date, startDate, endDate );
    }

This still leaves the trail of autoreleased objects, but dateByAddingComponents:toDate:options: is responsible. Not sure anything can be done about that.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...