Arhn - архитектура программирования

Как сгенерировать 30 дней в виде массива с помощью NSCalendar или NSDate?

Я пытаюсь создать массив из 30 дней, который учитывает переход на летнее время, високосный год и т. д. В настоящее время у меня есть генератор, который создает массив дней, но он не принимает во внимание особые изменения времени и год, месяц меняется. Вот мой текущий код:

    NSMutableArray* dates = [[NSMutableArray alloc] init];
    int numberOfDays=30;
    NSDate *startDate=[NSDate date];
    NSDate *tempDate=[startDate copy];
    for (int i=0;i<numberOfDays;i++) {
        NSLog(@"%@",tempDate.description);
        tempDate=[tempDate dateByAddingTimeInterval:(60*60*24)];
        [dates addObject:tempDate.description];
    }

    NSLog(@"%@",dates);

Каков наилучший способ создать генератор для циклического просмотра календаря для получения следующих 30 дней, начиная с сегодняшней даты, и массив должен включать сегодняшнюю дату и следующие 29 дней. Мой текущий код работает так, как я сказал, но он не совсем точен. Спасибо


Ответы:


1

Вы почти получили это; всего пара модификаций:

int numberOfDays=30;

NSDate *startDate=[NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *offset = [[NSDateComponents alloc] init];
NSMutableArray* dates = [NSMutableArray arrayWithObject:startDate];

for (int i = 1; i < numberOfDays; i++) {
  [offset setDay:i];
  NSDate *nextDay = [calendar dateByAddingComponents:offset toDate:startDate options:0];
  [dates addObject:nextDay];
}
[offset release];

NSLog(@"%@",dates);

Это создаст массив из NSDate объектов. На моей машине это журналы:

EmptyFoundation[4302:903] (
    "2011-02-16 16:16:26 -0800",
    "2011-02-17 16:16:26 -0800",
    "2011-02-18 16:16:26 -0800",
    "2011-02-19 16:16:26 -0800",
    "2011-02-20 16:16:26 -0800",
    "2011-02-21 16:16:26 -0800",
    "2011-02-22 16:16:26 -0800",
    "2011-02-23 16:16:26 -0800",
    "2011-02-24 16:16:26 -0800",
    "2011-02-25 16:16:26 -0800",
    "2011-02-26 16:16:26 -0800",
    "2011-02-27 16:16:26 -0800",
    "2011-02-28 16:16:26 -0800",
    "2011-03-01 16:16:26 -0800",
    "2011-03-02 16:16:26 -0800",
    "2011-03-03 16:16:26 -0800",
    "2011-03-04 16:16:26 -0800",
    "2011-03-05 16:16:26 -0800",
    "2011-03-06 16:16:26 -0800",
    "2011-03-07 16:16:26 -0800",
    "2011-03-08 16:16:26 -0800",
    "2011-03-09 16:16:26 -0800",
    "2011-03-10 16:16:26 -0800",
    "2011-03-11 16:16:26 -0800",
    "2011-03-12 16:16:26 -0800",
    "2011-03-13 16:16:26 -0700",
    "2011-03-14 16:16:26 -0700",
    "2011-03-15 16:16:26 -0700",
    "2011-03-16 16:16:26 -0700",
    "2011-03-17 16:16:26 -0700"
)

Обратите внимание, как смещение часового пояса изменилось 13 марта с -0800 на -0700. Это летнее время. :)

17.02.2011
  • просто примечание: я бы получил дни на самом деле в месяц вместо жестко закодированных 30 :-) (я знаю, что это то, о чем он просил). 17.02.2011
  • Спасибо Дейву за код и спасибо Расмусу за примечание. Как мне реализовать ваш код rasmus в генераторе? 17.02.2011

  • 2

    некоторый код для моей боковой заметки выше:

    - (NSRange) daysInMonth:(NSDate*)date {
    
        NSCalendar* cal = [NSCalendar currentCalendar];
        NSDateComponents *comps = [cal components:(NSYearCalendarUnit|NSMonthCalendarUnit) 
                                         fromDate:(date != nil) ? date: self.currentMonth];
    
        NSRange range = [cal rangeOfUnit:NSDayCalendarUnit
                                  inUnit:NSMonthCalendarUnit
                                 forDate:[cal dateFromComponents:comps]];
    
        return range;
    }
    
    17.02.2011
  • NSRange daysInMonth = [собственно daysInMonth: [дата NSDate]]; int numberOfDays = daysInMonth.length; 17.02.2011
  • +1 Спасибо, однако он говорит, что мой контроллер просмотра может не реагировать на -daysInMonth, а длина не является структурой или объединением. 17.02.2011
  • Вам нужно добавить метод daysInMonth в ваш файл .h. 17.02.2011
  • Я сделал обходной путь :-) NSCalendar* cal = [NSCalendar currentCalendar]; NSDateComponents* comps = [[[NSDateComponents alloc] init] autorelease]; Диапазон NSRange = [cal rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[cal dateFromComponents:comps]]; int numberOfDays = диапазон.длина; 17.02.2011
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..