Streetboy
Streetboy

Reputation: 4401

Getting all NSDates from now unwanted behavior

I want to get all NSDate from to to 30 days later. However it doesn't work correctly.

Here is the code i am using:

 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];

    }

I am getting list :

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

At the end of the list is:

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

So this is incorrect. There should be instead

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

Maybe someone could help me on this ?

Thank you.

Upvotes: 0

Views: 102

Answers (3)

Fernando Mazzon
Fernando Mazzon

Reputation: 3591

How about:

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];
}

Upvotes: 0

uchuugaka
uchuugaka

Reputation: 12782

You want to look at the Date & Time Programming Guide, especially: [Adding Components to a Date

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

You need to use the setDay: method in your loop to generate NSDate instances for each day offset from the reference NSDate you start with.

        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);
    }

Upvotes: 2

P.J
P.J

Reputation: 6587

I have different solution for you

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

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

Hope it helps you

Upvotes: 0

Related Questions