Подсчет первых и последних дней текущей недели
Ссылка на предварительно отвеченный вопрос по адресу: Начало первого и последнего дня текущей недели.
В приведенной выше ссылке есть два ответа. Один из них является теоретическим, а другой написан на языке PyObjC (язык моста Python-Objective C), и быстрый поиск в Google подтверждает, что PyObjC не работает с iPhone SDK.
Что касается вопроса, как можно получить переведенный код PyObjC для совместимости с iPhone SDK.
Цель: Предположим, сегодня (вт.) 19-е и Солнце. был 17 (начало недели) и сб. 23го числа конец недели. Я хочу получить строку вроде 19/01 - 23/01 [т.е. начало недели (hypen) конец недели]
4 ответа
Если у вас есть NSDate
Вы можете использовать текущий NSCalendar
чтобы получить эту дату NSDateComponents
, Установить NSDateComponents
"s weekday
1 (первый день недели), создайте копию и установите копию weekday
до 7 (последний день недели). Затем используйте NSCalendar
конвертировать как NSDateComponents
вернуться к своим соответствующим NSDate
объекты, после которых вы можете использовать NSDateFormatter
создать ваше строковое представление.
Эта ссылка содержит пример получения дня недели: /questions/37040273/kak-najti-kakoj-den-nedeli-dlya-lyuboj-dannoj-datyi-ispolzuya-kakao
Вот некоторый код, и он также проверяет крайний случай, когда начало недели начинается в предыдущем месяце:
// Finds the date for the first day of the week
- (NSDate *)getFirstDayOfTheWeekFromDate:(NSDate *)givenDate
{
NSCalendar *calendar = [NSCalendar currentCalendar];
// Edge case where beginning of week starts in the prior month
NSDateComponents *edgeCase = [[NSDateComponents alloc] init];
[edgeCase setMonth:2];
[edgeCase setDay:1];
[edgeCase setYear:2013];
NSDate *edgeCaseDate = [calendar dateFromComponents:edgeCase];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:edgeCaseDate];
[components setWeekday:1]; // 1 == Sunday, 7 == Saturday
[components setWeek:[components week]];
NSLog(@"Edge case date is %@ and beginning of that week is %@", edgeCaseDate , [calendar dateFromComponents:components]);
// Find Sunday for the given date
components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate];
[components setWeekday:1]; // 1 == Sunday, 7 == Saturday
[components setWeek:[components week]];
NSLog(@"Original date is %@ and beginning of week is %@", givenDate , [calendar dateFromComponents:components]);
return [calendar dateFromComponents:components];
}
Изменить: соответствующий код сверху
- (NSDate *)firstDayOfWeekFrom:(NSDate *)givenDate {
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate];
[components setWeekday:1]; // 1 == Sunday, 7 == Saturday
[components setWeekOfYear:[components weekOfYear]];
return [calendar dateFromComponents:components];
}
NSDate *weekDate = [NSDate date];
NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *currentComps = [myCalendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekOfYearCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:weekDate];
int ff = currentComps.weekOfYear;
NSLog(@"1 %d", ff);
[currentComps setWeekday:1]; // 1: sunday
NSDate *firstDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
[currentComps setWeekday:7]; // 7: saturday
NSDate *lastDayOfTheWeek = [myCalendar dateFromComponents:currentComps];
NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init];
myDateFormatter.dateFormat = @"dd EEEE";
NSString *firstStr = [myDateFormatter stringFromDate:firstDayOfTheWeek];
NSString *secondStr = [myDateFormatter stringFromDate:lastDayOfTheWeek];
NSLog(@"first - %@ \nlast - %@", firstStr, secondStr);
Это то, что я искал несколько дней назад и наконец нашел. Есть метод rangeOfUnit:startDate:interval:forDate:
в NSDate
и сделать это простым способом. Вы можете увидеть подробности по адресу: Текущая неделя начала и окончания