Расчет первых и последних дней текущей недели - PullRequest
3 голосов
/ 17 января 2010

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

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

Что касается вопроса, то как можно получить код PyObjC, переведенный для совместимости с iPhone SDK.

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

Ответы [ 4 ]

7 голосов
/ 17 января 2010

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

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

3 голосов
/ 04 февраля 2013

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

// 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];
}
0 голосов
/ 11 апреля 2014
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);
0 голосов
/ 06 мая 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...