从现在不需要的行为中获取所有NSDates

时间:2013-01-04 12:34:33

标签: objective-c nsdate nsdatecomponents

我希望将所有NSDate从30天后收到。但它无法正常工作。

以下是我正在使用的代码:

 for (int i = 0; i < days; i++) {

        NSDate *today = [self getToday];

        NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

        NSDateComponents *components = [[NSDateComponents alloc] init];
        components.day = i;
        NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0];

        NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit fromDate:nextMonth];

        NSDateComponents *todayDayComponents = [gregorian components:NSDayCalendarUnit fromDate:today];

        nextMonthComponents.day = todayDayComponents.day+i;
        NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents];
        DLog(@"nextMonthDay = %@",nextMonthDay);

        [months addObject:nextMonthDay];

    }

我得到名单:

nextMonthDay = 2013-01-03 22:00:00 +0000
nextMonthDay = 2013-01-04 22:00:00 +0000
nextMonthDay = 2013-01-05 22:00:00 +0000
nextMonthDay = 2013-01-06 22:00:00 +0000
nextMonthDay = 2013-01-07 22:00:00 +0000
nextMonthDay = 2013-01-08 22:00:00 +0000
nextMonthDay = 2013-01-09 22:00:00 +0000
nextMonthDay = 2013-01-10 22:00:00 +0000
nextMonthDay = 2013-01-11 22:00:00 +0000
nextMonthDay = 2013-01-12 22:00:00 +0000
nextMonthDay = 2013-01-13 22:00:00 +0000
nextMonthDay = 2013-01-14 22:00:00 +0000
nextMonthDay = 2013-01-15 22:00:00 +0000
nextMonthDay = 2013-01-16 22:00:00 +0000
nextMonthDay = 2013-01-17 22:00:00 +0000
nextMonthDay = 2013-01-18 22:00:00 +0000
nextMonthDay = 2013-01-19 22:00:00 +0000
nextMonthDay = 2013-01-20 22:00:00 +0000
nextMonthDay = 2013-01-21 22:00:00 +0000
nextMonthDay = 2013-01-22 22:00:00 +0000
nextMonthDay = 2013-01-23 22:00:00 +0000
nextMonthDay = 2013-01-24 22:00:00 +0000
nextMonthDay = 2013-01-25 22:00:00 +0000
nextMonthDay = 2013-01-26 22:00:00 +0000
nextMonthDay = 2013-01-27 22:00:00 +0000
nextMonthDay = 2013-01-28 22:00:00 +0000
nextMonthDay = 2013-01-29 22:00:00 +0000
nextMonthDay = 2013-01-30 22:00:00 +0000
nextMonthDay = 2013-03-03 22:00:00 +0000
nextMonthDay = 2013-03-04 22:00:00 +0000

列表末尾是:

nextMonthDay = 2013-01-29 22:00:00 +0000
nextMonthDay = 2013-01-30 22:00:00 +0000
nextMonthDay = 2013-03-03 22:00:00 +0000
nextMonthDay = 2013-03-04 22:00:00 +0000

所以这是不正确的。应该是

2013-01-29 22:00:00 +0000
2013-01-30 22:00:00 +0000
2013-03-01 22:00:00 +0000
2013-03-02 22:00:00 +0000

也许有人可以帮我这个?

谢谢。

3 个答案:

答案 0 :(得分:2)

你想看日期&amp;时间编程指南,尤其是:[将组件添加到日期

(https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1)

您需要在循环中使用setDay:方法为每天从您开始的引用NSDate偏移量生成NSDate实例。

        NSLog(@"30 consecutive days!");// just hello.
                                   // Set up data outside the loop...
    NSDate *today = [[NSDate alloc] init];
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
        // Surely you want to do something clever with these beyond logging them immediately, right? Let's put them in an array. They'll be in order and we can use them again later.
    NSMutableArray *thirtyConsecutiveDays = [[NSMutableArray alloc] initWithCapacity:30];
    int days = 30; // This is one less than thirty-one.
                   // Ok, let's loop!
    for (int i = 0; i < days; i++) {
            // We're going to want a new one of these each time through the loop.
        NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
            // We need to tell it how far to offset from the reference NSDate.
        [offsetComponents setDay:i]; // incrementing by i days.
                                     // We will have our current NSDateComponents friend tell our NSCalendar friend what NSDate we want next...
        NSDate *anotherDate = [gregorian dateByAddingComponents: offsetComponents
                                                         toDate:today options:0];
            // Now add our latest NSDate iteration to our array.
        [thirtyConsecutiveDays addObject:anotherDate];
    }
        // This is just logging results.
    for (NSDate *aDate in thirtyConsecutiveDays) {
        NSLog(@"%@",aDate);
    }

答案 1 :(得分:0)

我有不同的解决方案

int min = 60*60*24;
for (int i = 0; i < days; i++) {

        NSDate *today = [self getToday];
        NSDate *newDate = [today dateByAddingTimeInterval:(min*i)];
}

希望它可以帮到你

答案 2 :(得分:0)

怎么样:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.day = 1;
NSDate *date = [self getToday];
for (int i = 1; i < 30 ; i++) {
    date = [calendar dateByAddingComponents:components toDate:date options:0];
    [months addObject:date];
}