2

特定の年の記念日 (5 月の最後の月曜日) の NSDate を決定するより良い方法はありますか?

NSInteger aGivenYear = 2013 ;

NSCalendar* calendar = [NSCalendar currentCalendar] ;
NSDateComponents* firstMondayInJuneComponents = [NSDateComponents new] ;
firstMondayInJuneComponents.month = 6 ;
// Thanks, Martin R., for pointing out that `weekOfMonth` is wrong for returning the first Monday in June.
firstMondayInJuneComponents.weekOfMonth = 1 ;
firstMondayInJuneComponents.weekday = 2 ; //Monday
firstMondayInJuneComponents.year = aGivenYear ;
NSDate* firstMondayInJune = [calendar dateFromComponents:firstMondayInJuneComponents] ;

NSDateComponents* subtractAWeekComponents = [NSDateComponents new] ;
subtractAWeekComponents.week = 0 ;
NSDate* memorialDay = [calendar dateByAddingComponents:subtractAWeekComponents toDate:firstMondayInJune options:0] ;

編集

firstMondayInJune上記の例では、すべての年で機能しないことがわかりました。2012 年の 5 月 28 日を返します。

ありがとう、マーティン・R。weekdayOrdinal私が望んでいたことを正確に実行し、3 行少ないコードでメモリアル デーを返します。

NSInteger aGivenYear = 2013 ;

NSDateComponents* memorialDayComponents = [NSDateComponents new] ;
memorialDayComponents.year = aGivenYear ;
memorialDayComponents.month = 5 ;
memorialDayComponents.weekday = 2 ; //Monday
memorialDayComponents.weekdayOrdinal = -1 ; //The last instance of the specified weekday in the specified month & year.
NSDate* memorialDay = [calendar dateFromComponents:memorialDayComponents] ;
4

2 に答える 2

5

月の最初の月曜日を取得するには、weekdayOrdinal = 1代わりにweekOfMonth = 1次のように設定します。

NSInteger aGivenYear = 2012 ;

NSCalendar* calendar = [NSCalendar currentCalendar] ;
NSDateComponents* firstMondayInJuneComponents = [NSDateComponents new] ;
firstMondayInJuneComponents.month = 6 ;
firstMondayInJuneComponents.weekdayOrdinal = 1 ;
firstMondayInJuneComponents.weekday = 2 ; //Monday
firstMondayInJuneComponents.year = aGivenYear ;
NSDate* firstMondayInJune = [calendar dateFromComponents:firstMondayInJuneComponents] ;
// --> 2012-06-04

NSDateComponents* subtractAWeekComponents = [NSDateComponents new] ;
subtractAWeekComponents.week = -1 ;
NSDate* memorialDay = [calendar dateByAddingComponents:subtractAWeekComponents toDate:firstMondayInJune options:0] ;
// --> 2012-05-28

NSDateComponentsドキュメントから:

平日の序数単位は、月など、次に大きな暦単位内での曜日の位置を表します。たとえば、2はその月の第 2金曜日の平日の序数単位です。

于 2013-01-03T22:05:32.353 に答える
-1

私がおそらく行うことは、月の最初の曜日を取得し(おそらくNSDateFormatterを使用して)、最初の月曜日/火曜日/木曜日/その月の日付を計算してから、(週番号 - 1 ) x 7 をその日付まで実行して、その月の N 番目の月曜日を取得します。

記念日の場合、最初に第 5 月曜日がまだ 5 月であるかどうかを確認し、そうでない場合は第 4 月曜日を使用します。(または、メモリアルデーが 31 日である場合、最初の月曜日は 3 日またはそれ以前でなければならないことを知って、チェックインしてください。)

于 2013-01-03T22:02:07.577 に答える