16

作業中の Cocoa アプリに繰り返しイベントを追加しています。これらは数学的に定義できるため (3600*24*7 = 1 週間)、毎日、毎週繰り返します。次のコードを使用して日付を変更します。

[NSDate dateWithTimeIntervalSinceNow:(3600*24*7*(weeks))]

イベントが繰り返されてから何か月が経過したかはわかっていますが、1 か月/3 か月/6 か月/9 か月先を表す NSDate オブジェクトを作成する方法がわかりません。理想的には、ユーザーに 10 月 14 日から毎月繰り返すと言ってもらい、毎月 14 日に繰り返します。

4

5 に答える 5

37

(この質問とほぼ同じです。)

ドキュメントから:

NSCalendarDate の使用は強くお勧めしません。まだ非推奨ではありませんが、Mac OS X v10.5 の後の次のメジャー OS リリースでサポートされる可能性があります。カレンダー計算では、NSCalendar、NSDate、および NSDateComponents の適切な組み合わせを使用する必要があります。これについては、Cocoa の Dates and Times Programming Topics のCalendars で説明されています。

そのアドバイスに従って:

NSDate *today = [NSDate date];

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

NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];

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

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

nextMonthComponents.day = todayDayComponents.day;
NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents];

[gregorian release];

より直接的または効率的な実装があるかもしれませんが、これは正確であり、正しい方向を指しているはずです。

于 2008-10-09T06:20:02.847 に答える
22

NSCalender、NSDateComponents、および NSDate を使用します。

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
components.month = 1;
NSDate *oneMonthFromNow = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:[NSDate date] options:0];

のさまざまなプロパティを設定して、さまざまなcomponents期間 (3 か月、6 か月など) を取得するだけです。

注: コンテキストによっては、「1 か月」が「グレゴリオ暦の 1 か月」を意味する場合、[[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]代わりにを使用することもできます。[NSCalendar currentCalendar]

于 2010-04-05T05:01:49.937 に答える
0

おそらくNSCalendarDateを使用します。

現在の日付のdayOfMonth、monthOfYear、yearOfCommonEraを3つの数値として取得します。

必要な月数(1/3/6/9)を追加し、1)その日付が存在するかどうか(たとえば、うるう年ではない4月31日、2月29日)、および2)年のロールオーバーに注意します。

NSCalendarDateのinitWithYear:month:day:hour:minute:second:timeZoneを使用して新しい日付を作成します。

于 2008-10-09T04:17:22.300 に答える
0

以下のようにできます。

NSDate *today = [NSDate date];

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

NSDateComponents *components = [[NSDateComponents alloc] init];
components.month = 1;
NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0];
[components release];

NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:nextMonth];
NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents];

[gregorian release]; 
于 2012-07-17T06:23:24.193 に答える
0

NSCalendarDateは新しい SDK でサポートされなくなりました。配布用のビルド中に問題が発生します。

于 2009-02-16T07:31:16.620 に答える