Подтвердить что ты не робот

Как проверить, в какой день недели (т.е. Вт, Пт?) И сравнить два NSDates?

Я ищу две вещи:

  • Проверьте, прошла ли неделя (в зависимости от дня недели).
  • Проверьте, прошел ли день (в зависимости от даты).

Я не уверен, что лучший способ решить это, поскольку, сравнивая два NSDates (один в 1/1/09 в 21:30 и другой в 1/2/09 в 00:30), я могу " t просто посмотрите, прошло ли 24 часа, поскольку в этом случае это не так. Я могу решить это, просто получив дату 1/1/09 из NSDate, но я не уверен, как это сделать на основе документации и ссылок Google, которые я видел.

Для другой проблемы я не знаю, как узнать, в какой день недели ему дана дата. Я бы хотел, если 1/1/09 - вторник, понедельник и т.д. Есть ли библиотека, которая позволит вам рассчитать это? Это, очевидно, нужно учитывать високосные годы и массу других вещей... Может быть, для этого существует библиотека objective-c?

Спасибо за любую помощь!

4b9b3361

Ответ 1

Вы можете использовать NSDateComponents для этого:

unsigned units = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [gregorian components:units fromDate:date];

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

[components year];
[components month];
[components day];

Или вы можете построить новый объект NSDate с помощью метода NSCalendar dateFromComponents и сравнить два объекта NSDate.

Ответ 2

Вы можете использовать components:fromData: сообщение класса NSCalendar для получения отдельных компонентов даты:

// Sunday = 1, Saturday = 7
int weekday = [[[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:theDate] weekday];

Чтобы сравнить две даты, просто используйте сообщение compare::

switch([date1 compare:date2])
{
case NSOrderedSame:       /* they are the same date */ break;
case NSOrderedAscending:  /* date1 precedes date2 */ break;
case NSOrderedDescending: /* date2 precedes date1 */ break;
}