1

今日から来月までの NSDates の配列を作成したいと考えています。これは Ruby で簡単に実行できます。Time.now..(Time.now + 30.days)

Objective C で Ruby のように日付の配列を作成するにはどうすればよいですか?

4

3 に答える 3

5

残念ながら、ObjC ソリューションは、その Ruby コードよりもはるかに冗長になります。

計算を行う正しい方法は次のNSDateComponentsとおりです。

NSMutableArray * dateArray = [NSMutableArray array];
NSCalendar * cal = [NSCalendar currentCalendar];
NSDateComponents * plusDays = [NSDateComponents new];
NSDate * now = [NSDate date];
for( NSUInteger day = 0; day < NUMDAYS; day++ ){
    [plusDays setDay:day];
    [dateArray addObject:[cal dateByAddingComponents:plusDays toDate:now options:0]];
}

手順をより便利にするために (数回以上実行する必要がある場合)、このループを のカテゴリ メソッドに入れ、引数に置き換えてをNSCalendar置き換えることができます。NUMDAYSselfcal

于 2013-08-14T21:57:34.990 に答える
2

多くの反対票とコメントの後、これが私の改訂された答えです...

-(NSDate *)nextDayFromDate:(NSDate *)originalDate {

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateComponent = [NSDateComponents new];
    dateComponent.day = 1;
    NSDate *tomorrow = [calendar dateByAddingComponents:dateComponent toDate:originalDate options:0];
    return tomorrow;
}

NSMutableArray *dateArray = [NSMutableArray array];
NSDate *now = [NSDate date];
[dateArray addObject:now];
for (int i=0;i<31;i++) {
    NSDate *firstDate = [dateArray objectAtIndex:i];
    NSDate *newDate = [self nextDayFromDate:firstDate];
    [dateArray addObject:newDate];
}

これが行うことは、NSCalendar API を使用して、任意の NSDate に「日間隔」を追加することです。配列に "Now" を追加し、ループを 30 回実行します。そのたびに前の NSDate オブジェクトをロジックへの入力として使用します。

于 2013-08-14T21:39:39.887 に答える
2

あなたが投稿したRubyほど簡潔にこれを行うために組み込まれたものはありません。問題を分解すると、特定の日付の翌日を取得する方法が必要になります。これを行う関数は次のとおりです。

NSDate *CalendarDayAfterDate(NSDate *date)
{
    NSDateComponents *components = [[NSDateComponents alloc] init];
    components.day = 1;

    NSCalendar *calendar = [NSCalendar currentCalendar];
    return [calendar dateByAddingComponents:components toDate:date options:0];
}

次に、次々と日の配列を取得する必要があります。

NSDate *today = [NSDate date];
NSMutableArray *dates = [NSMutableArray arrayWithObject:today];
for (NSUInteger i=0; i<30; i++) {
    NSDate *tomorrow = CalendarDayAfterDate(today);
    [dates addObject:tomorrow];
    today = tomorrow;
}
于 2013-08-14T21:57:32.440 に答える