Работа с NSCalendar - получение следующего первого вторника месяца - PullRequest
3 голосов
/ 25 марта 2010

Это немного странно, но возможно ли использовать NSCalendar (или любой другой компонент), чтобы выяснить, какой будет дата следующего "первого вторника месяца"?

Например, сегодня четверг, 25 марта 2010 года. Следующий «первый вторник месяца» будет 6 апреля. Аналогично, если бы я искал следующий «первый вторник месяца» 1 апреля, все равно будет 6 апреля.

Как бы вы это сделали?

Большое спасибо !!!!!

Ответы [ 2 ]

4 голосов
/ 25 марта 2010

Приведенный ниже код рассчитывает первый вторник данной комбинации месяца / года. Он написан на MacRuby , потому что это то, с чем я только что попробовал, но у вас не должно быть проблем с преобразованием его в надлежащий Objective-C, это просто другой синтаксис (я люблю MacRuby за быстрое воплощение идеи ):

dc = NSDateComponents.alloc.init
# Set month to April 2010
dc.setYear 2010
dc.setMonth 4

dc.setWeekday 3 # 1 = Sunday, 2 = Monday, ...
dc.setWeekdayOrdinal 1 # We want the first weekday of the month

cal = NSCalendar.alloc.initWithCalendarIdentifier NSGregorianCalendar
date = cal.dateFromComponents dc
date.description # => "2010-04-06 00:00:00 +0200"

Я оставляю вам право определять «следующий первый вторник» по заданной дате: сначала сделайте расчет для месяца текущей даты, а если результат в прошлом, сделайте это снова для следующего месяца. Используйте -[NSCalendar components:fromDate:], чтобы получить комбинацию месяц / день для данной NSDate.

1 голос
/ 25 марта 2010

К сожалению, я не могу проверить неспособность этого кода, но некоторые должны выглядеть так:

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setWeekday:2]; // Monday
[components setMonth:5]; // May
[components setYear:2008];
[components setWeekdayOrdinal:1]
NSCalendar *gregorian = [[NSCalendar alloc]
                         initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date = [gregorian dateFromComponents:components];

Образцы и подробную информацию см. В этом руководстве

...