2010-03-25 5 views
3

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

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

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

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

ответ

4

Приведенный ниже код вычисляет первый вторник данная комбинация месяца/года. Это написано в 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.

+0

просто фантастически! –

1

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

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]; 

Для образцов и подробно информация посмотреть guide

+0

Спасибо, но это просто жестко кодирует дату. Мне нужно иметь возможность динамически определять, что я ищу, это ... –

+0

Да, конечно. Это просто образец :-) – Victor

+1

Это не сработает. Вам нужно включить '[components setWeekdayOrdinal: 1];'. –

Смежные вопросы