2014-05-15 15 views
4

Учитывая NSDate, как я могу найти первый день недели этой даты, учитывая локаль пользователя. Например, я слышал, что некоторые страны рассматривают понедельник как первый день недели, а другие используют воскресенье. Мне нужно вернуть предыдущий понедельник в первом случае, но в предыдущее воскресенье в последнем случае.Поиск локально-зависимого первого дня недели

Мои лучшие усилия до сих пор всегда возвращает предыдущее воскресенье, независимо от настроек устройства применяются:

NSCalendar *calendar = [NSCalendar currentCalendar]; 
[calendar setLocale:[NSLocale currentLocale]]; 
NSDateComponents *components = [calendar components:NSYearForWeekOfYearCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit fromDate:originalDate]; 
[components setWeekday:1]; 
NSDate *firstDayOfWeek = [calendar dateFromComponents:components]; 

Бонус вопрос: на IOS, которые устанавливающих диски это? Это «Формат региона»?

+0

Также см http://stackoverflow.com/questions/16876813/cocoa-get-first-day-in-week?rq=1, который решает ту же проблему. – rmaddy

ответ

5

Попробуйте изменить:

[components setWeekday:1]; 

к:

[components setWeekday:[calendar firstWeekday]]; 

Вы должны также удалить NSYearForWeekOfYearCalendarUnit и NSWeekCalendarUnit компонентов.

Бонус Вопрос: «Формат региона» должен быть настройкой, которая изменяет первый день недели.

+0

Спасибо - я прочитал, что NSYearForWeekOfYearCalendarUnit и NSWeekCalendarUnit необходимы для обработки даты, например, среда, 2 января, где предшествующий первый день недели находится в предыдущем году. Я посмотрю, смогу ли я найти источник. –

+1

@BenPackard Допустим, я предложил удалить их, потому что это не кажется необходимым. Я не знаю точно. – rmaddy

0

Более умный способ для старого стиля для тех, кто не хочет устанавливать календарь в первый вторник.

NSDate *date = [NSDate dateWithTimeIntervalSince1970:1483620311.228]; 
NSLog(@"current date ===> : %@", date); 
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDate *previousMonday = [calendar nextDateAfterDate:date 
            matchingUnit:NSCalendarUnitWeekday 
              value:2 //use 1-7 for Sunday to Saturday week day. 
             options:NSCalendarMatchNextTime | NSCalendarSearchBackwards]; 
NSLog(@"previousMonday date ===> : %@", previousMonday); 
Смежные вопросы