Работа с Nscalendar - получение первого вторника месяца
-
22-09-2019 - |
Вопрос
Это немного странно, но возможно ли использовать NSCALENDAR (или любой компонент, в этом отношении), чтобы выяснить, какая будет дата следующего «Первого вторника месяца»?
Например, сегодня в четверг, 25 марта 2010 года. Следующий «первый вторник месяца» состоится 6 апреля. Точно так же, если бы я искал следующий «первый вторник месяца» 1 апреля, это все равно будет 6 апреля.
Как бы вы это сделали?
Спасибо большое!!!!!
Решение
Приведенный ниже код рассчитывает первый вторник данной комбинации месяца/года. Это написано в МакРуби Поскольку это то, с чем я только что попробовал, но у вас не должно быть проблем, чтобы преобразовать его в правильную 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.
Другие советы
К сожалению, я не могу проверить неспособность этого кода, но некоторые должны выглядеть так:
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];
Для образцов и подробной информации см. Это руководство