Как получить названия месяцев и лет между двумя датами - PullRequest
4 голосов
/ 02 марта 2011

Я хотел бы получить названия месяцев и лет между двумя датами.Предположим, моя начальная дата 01-23-2010, а конечная дата 02-25-2011, поэтому я хотел бы получить список месяцев с соответствующим годом, например, январь 2010, февраль 2010 ----- февраль 2011.

Ответы [ 2 ]

10 голосов
/ 02 марта 2011

Вот примерно как я это сделаю (предупреждение: введите в браузере, yadda yadda):

NSDate *startDate = ...; // your start date
NSDate *endDate = ...; // your end date
NSDateComponents *monthDifference = [[NSDateComponents alloc] init];

NSMutableArray *dates = [NSMutableArray arrayWithObject:startDate];
NSUInteger monthOffset = 0;
NSDate *nextDate = startDate;
do {
    [dates addObject:nextDate];

    [monthDifference setMonth:monthOffset++];
    NSDate *d = [[NSCalendar currentCalendar] dateByAddingComponents:monthDifference toDate:startDate options:0];
    nextDate = d;
} while([nextDate compare:endDate] == NSOrderedAscending);

Это должно дать вам массив NSDate объектов, представляющих даты, которые происходят примерно через месяцкроме этого, начиная с начальной даты и заканчивая или около вашей конечной даты.

Если вы хотите отобразить их в удобочитаемом виде, вы будете использовать NSDateFormatter:

NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"MMMM yyyy"];
for (NSDate *date in dates) {
  NSLog(@"%@", [f stringFromDate:date]);
}

[f release];

Когда я запускаю это на своем компьютере, я получаю:

EmptyFoundation[3327:a0f] January 2010
EmptyFoundation[3327:a0f] February 2010
EmptyFoundation[3327:a0f] March 2010
EmptyFoundation[3327:a0f] April 2010
EmptyFoundation[3327:a0f] May 2010
EmptyFoundation[3327:a0f] June 2010
EmptyFoundation[3327:a0f] July 2010
EmptyFoundation[3327:a0f] August 2010
EmptyFoundation[3327:a0f] September 2010
EmptyFoundation[3327:a0f] October 2010
EmptyFoundation[3327:a0f] November 2010
EmptyFoundation[3327:a0f] December 2010
EmptyFoundation[3327:a0f] January 2011
EmptyFoundation[3327:a0f] February 2011

Это может показаться довольно сложным, но у него есть пара преимуществ:

  • это будет работать независимо от того, какой календарной системы вы используете.Просто измените [NSCalendar currentCalendar] вызов на другой календарь, и он будет работать в этом (иврит, исламский и т. Д.)
  • он учитывает месяцы с причудливым числом дней (28 дней против 29 дней, иликалендари с високосными месяцами [да, они существуют])
1 голос
/ 02 марта 2011

То, что вы хотите использовать, это NSDateFormatter. В документации написано:

Создание экземпляров NSDateFormatter строковые представления NSDate (и NSCalendarDate) объектов и конвертировать текстовые представления дат и раз в NSDate объекты. Вы можете выразить представление дат и время гибко с помощью предустановки стили формата или пользовательский формат строки.

Если вам нужно определить, какие месяцы фактически находятся между двумя датами, вы можете использовать NSCalendar.

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