Расчет первого и последнего дней текущей недели

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

В приведенной выше ссылке есть два ответа. Один из них является теоретическим, а другой - на языке под названием PyObjC (язык моста Python-Objective C), и быстрый поиск в Google подтверждает, что PyObjC не работает с iPhone SDK.

Итак, что касается вопроса, как можно перевести код PyObjC для совместимости с iPhone SDK.

Цель: Предположим, сегодня (вторник) 19-е, а вс. было 17-е (начало недели) и сб. 23-е - конец недели. Я хочу получить строку типа 19/01 - 23/01 [т.е. Начало недели (гипен) конец недели]


person Dot    schedule 17.01.2010    source источник
comment
Apple представляет собой прекрасный пример: developer.apple .com / Library / ios / # documentation / Cocoa / Conceptual /   -  person iwasrobbed    schedule 04.02.2013


Ответы (3)


Если у вас есть NSDate, вы можете использовать текущий NSCalendar, чтобы получить NSDateComponents этой даты. Установите weekday NSDateComponents на 1 (первый день недели), создайте копию и установите weekday копии на 7 (последний день недели). Затем используйте NSCalendar для преобразования обоих NSDateComponents обратно в соответствующие объекты NSDate, после чего вы можете использовать NSDateFormatter для создания строкового представления.

Эта ссылка содержит пример того, как получить день недели для даты: https://stackoverflow.com/questions/1057349#1057405

person Dave DeLong    schedule 17.01.2010
comment
Что, если неделя охватывает конец одного месяца и начало следующего? - person i_am_jorf; 17.10.2012
comment
@jeffamaphone преобразование NSDateComponents в NSDate с помощью NSCalendar будет обрабатывать любые месячные пролонгации. Если у вас возникли проблемы с этим, не стесняйтесь задавать новый вопрос, дайте мне знать, и я отвечу на него. - person Dave DeLong; 17.10.2012
comment
Ах хорошо. Теперь я вижу, что weekday не дата, а порядковый номер дня недели. Теперь имеет больше смысла. :) - person i_am_jorf; 17.10.2012
comment
rangeofunit - Посмотрите ответ (не принятый ответ) здесь: stackoverflow.com/questions/11681815/ - person wuf810; 12.08.2014

Вот код, и он также проверяет крайний случай, когда начало недели начинается в предыдущем месяце:

// 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];
}
person iwasrobbed    schedule 04.02.2013

Это то, что я искал несколько дней назад и наконец нашел. В NSDate есть метод rangeOfUnit:startDate:interval:forDate:, и сделать это очень просто. Подробную информацию можно найти по адресу: Дата начала и окончания текущей недели

person Albert Zhang    schedule 06.05.2013