NSDate で「次の日曜日」を取得する - Objective-C プログラミング
PROGRAM
NSDate で「次の日曜日」を取得する
Objective-C で、ある日付を基準にして、次の曜日を取得する方法について考えてみました。
最初は 年や日などを指定して NSDate を作成する に記した "第何週目の曜日の日付を取得する" 方法での実現を目指していたのですけど、この方法だと月曜日以外から始まる月を考慮しないといけなくなってしまい、複雑になるのでやめました。
実現した方法としては、基準日から曜日を取得して、そこから何日後に目的の曜日があるかを計算します。
グレゴリオ暦での NSDateComponents の場合、日曜日の 1 で始まり土曜日の 7 で終わるので、目的の曜日番号から基準日の曜日番号を引けば、目的の曜日が基準日の前後何日であるかを判断できます。
これだけだと、同じ週の前の曜日はマイナスになりますが、今回は "次の" 目的の曜日なので、マイナスになった場合には、一週間先の意味を込めて 7 を足すことで対応します。
目的の曜日が基準日と同じだった場合(差が 0 だった場合)も同様に、一週間後としての 7 を加えます。
NSCalendar* calendar = [NSCalendar currentCalendar];
// 渡された日付から曜日を取り出します。
NSDateComponents* baseComponents = [calendar components:NSWeekdayCalendarUnit fromDate:date];
NSDateComponents* addingComponents = [[NSDateComponents alloc] init];
// 指定された曜日だけ進めます。
NSInteger addingDay = weekday - baseComponents.weekday;
// 同じ曜日か手前の曜日の場合は 0 以下になるので、そのときは一週間先を指定します。
if (addingDay <= 0) addingDay += 7;
// 目的の曜日の日付を取得します。
addingComponents.day = addingDay;
NSDate* result = [calendar dateByAddingComponents:addingComponents toDate:date options:0];
このようにすることで、変数 result に、日付 date を基準にして次の weekday 曜日の日付を取得することができました。
weekday で指定する曜日は、日曜日から土曜日まで順に 1 から 7 の数値で指定します。
[ もどる ]