NSDATE- 1年前、ジレンマ
-
12-10-2019 - |
質問
私は、私にとっては少し難しいことをしようとしています。しかし、私は誰かがいくらかの洞察を持っていると確信しています。
日付を与えられた、たとえば January 17, 2011
, 、私は1年前にこの日付に対応する日を把握しようとしています。それで January 17, 2011
月曜日であり、1年前、この日は January 18, 2010
(月曜日も)。それはそうだとわかります January 18, 2010
354日前です January 17, 2011
. 。私はもともと、骨がない年に365日、跳躍年の366日を単に減らすだけだと思っていましたが、この場合にそれを行うと、あなたは得るでしょう January 17, 2010
, 、これは月曜日ではなく日曜日です。
したがって、Objective-Cで NSDate
と NSCalendar
, 、次のような関数を実装するにはどうすればよいですか。
-(NSDate *)logicalOneYearAgo:(NSDate *)from {
}
言い換えれば、n月のn番目の「平日」(「平日」は月曜日または火曜日または水曜日など)
解決 5
答えは非常に簡単であることが判明しました。試行錯誤から判明しました。これが答えです。
年が跳躍年である場合は、365日を差し引いてください。
年が跳躍年でない場合は、364日を差し引いてください。
他のヒント
次のような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];
}
これはで覆われています 日付と時刻のプログラミングガイド カレンダーの計算に関するセクション、 日付にコンポーネントを追加します
具体的には、関心のある方法はです 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];
私はこれが最も効率的な方法であることを保証することはできませんが、あなたはそれを使用することができます NSCalendar
と NSDateComponents
. 。あなたを渡します NSDate
インスタンスに [yourCalendar components:yourComponents fromDate:yourDate]
, 、コンポーネントから1年を減算してから使用します [yourCalendar dateFromComponents:yourComp]
.
完全なコードを提供していないことは申し訳ありませんが、これらの方法で作業してからしばらく経ちましたが、機能しないコードを提供したくありません。
1年を覆します。次に、必要な曜日に終わるまで1日を覆します。
毎年「曜日」は1日前に戻りますが、その間に2月29日がある場合を除き、2日前に戻ります。
それは、1年が52週間 + 1日であるためです(跳躍年で+2)。
したがって、このロジックを無期限に適用すると、5月24日に6月16日に何年も経たないうちに終了します。
それが起こりたくない場合は、どこかに参照年を記憶し、その算術を基にしなければなりません。
たとえば、「新しい」月曜日が4日前(3年が経過したため)である場合、数年後の無期限に請求しないように、3日前に月曜日を選択することを好むかもしれません。
それが役に立てば幸い。