0

我想在 30 天后得到所有的 NSDate。但是它不能正常工作。

这是我正在使用的代码:

 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 回答