0

すべての 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

多分誰かがこれについて私を助けることができますか?

ありがとうございました。

4

3 に答える 3

2

特に、日付と時刻のプログラミングガイドを参照してください。[日付へのコンポーネントの追加

](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);
    }
于 2013-01-04T13:37:34.837 に答える
0

私はあなたのために別の解決策を持っています

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

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

それがあなたを助けることを願っています

于 2013-01-04T13:23:19.717 に答える
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];
}
于 2013-01-04T13:38:12.947 に答える