5

私にとっては少し難しいことをやろうとしています。しかし、誰かが何らかの洞察力を持っていると確信しています。

たとえば、日付が与えられた場合、January 17, 20111 年前のこの日付に対応する日を見つけようとしています。月曜日もそうJanuary 17, 2011で、1 年前、この日はJanuary 18, 2010月曜日でした。January 18, 2010は の 354 日前であることがわかりJanuary 17, 2011ます。うるう年でない年は 365 日、うるう年は 366 日を単純に引くだけだと最初は思っていたのですが、この場合January 17, 2010は、月曜日ではなく日曜日になります。

したがって、Objective-C でNSDateandを使用するとNSCalendar、次のような関数をどのように実装できますか。

-(NSDate *)logicalOneYearAgo:(NSDate *)from {
}

つまり、n 番目の月の n 番目の「平日」 (「平日」は月曜日、火曜日、水曜日など)

4

5 に答える 5

22

次のようにNSDateComponentsを使用します。

- (NSDate *)logicalOneYearAgo:(NSDate *)from {

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

    NSDateComponents *offsetComponents = [[[NSDateComponents alloc] init] autorelease];
    [offsetComponents setYear:-1];

    return [gregorian dateByAddingComponents:offsetComponents toDate:from options:0];

}
于 2011-01-18T22:47:09.723 に答える
11

これについては、日付と時刻のプログラミング ガイドの「カレンダー計算、日付へのコンポーネントの追加」セクションで説明されています。

具体的には、対象となるメソッドはdateByAddingComponents:toDate:optionsです。

Apple の例をベースとして使用して、現在の日付から 1 年を減算するには、次のようにします。

NSDate *today = [[NSDate alloc] init];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

/*
  Create a date components to represent the number of years to add to the current date.
  In this case, we add -1 to subtract one year.     
*/

NSDateComponents *addComponents = [[NSDateComponents alloc] init];
addComponents.year = - 1;

return [calendar dateByAddingComponents:addComponents toDate:today options:0];
于 2012-05-15T13:57:45.233 に答える
3

これが最も効率的な方法であるとは保証できませんが、 and を使用して実行できNSCalendarますNSDateComponentsNSDateインスタンスを に渡し[yourCalendar components:yourComponents fromDate:yourDate]、コンポーネントから年を差し引いてから を使用します[yourCalendar dateFromComponents:yourComp]

完全なコードを提供できなくて申し訳ありませんが、これらのメソッドを使用してからしばらく経ちました。機能しないコードを提供したくありません。

于 2011-01-18T22:42:47.840 に答える
0

1年引きます。次に、希望する同じ曜日になるまで 1 日を引きます。

毎年、「曜日」は 1 日戻りますが、間に 2 月 29 日がある場合は 2 日戻ります。

これは、1 年が 52 週 + 1 日 (うるう年は +2) であるためです。

したがって、この論理を無期限に適用すると、何年にもわたって 6 月 16 日が 5 月 24 日になることになります。

そうしたくない場合は、参照年をどこかに記憶し、それに基づいて計算する必要があります。

たとえば、「新しい」月曜日が 4 日前の場合 (3 年が経過しているため)、何年も何年も無期限に減算しないように、3 日前の月曜日を選択することをお勧めします。

それが役に立てば幸い。

于 2011-06-16T08:33:48.787 に答える
-8

答えは非常に単純であることがわかりました。試行錯誤の末出来上がりました。これが答えです。

その年がうるう年の場合は、365 日を引きます。

その年がうるう年でない場合は、364 日を引きます。

于 2011-01-18T23:41:29.577 に答える