Подсчет первых и последних дней текущей недели

Ссылка на предварительно отвеченный вопрос по адресу: Начало первого и последнего дня текущей недели.

В приведенной выше ссылке есть два ответа. Один из них является теоретическим, а другой написан на языке 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 и сделать это простым способом. Вы можете увидеть подробности по адресу: Текущая неделя начала и окончания

Другие вопросы по тегам