NSString разобрать, чтобы найти дату - PullRequest
1 голос
/ 31 марта 2012

Я извлекаю информацию из базы данных, которая содержит странные даты в формате.

Когда они извлекаются, они имеют формат:

DayOfWeek, месяц Дата

Я пытаюсь использовать EventKit, чтобы иметь возможность добавить дату для пользователейкалендарь.

Кажется, я не могу найти лучший способ сделать это.

Любая помощь или указание в правильном направлении будет очень очень ценным !!

Ответы [ 2 ]

3 голосов
/ 31 марта 2012

Вы хотите использовать NSDateFormatter:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"EEEE, MMMM d";
NSDate *date = [dateFormatter dateFromString:@"Tuesday, March 3"];

"DayOfWeek, Month Date" неоднозначно, поэтому я постарался угадать, что вы имели в виду.Если я ошибся, вам нужно немного изменить формат строки. Вот ссылка на строки, которые вы можете использовать.

1 голос
/ 31 марта 2012

Ваша проблема в том, что в этой базе данных есть неоднозначные даты. У него нет годовой информации. NSDateFormatters не угадывает информацию о дате. Они создают даты из информации, которую вы предоставляете. И поскольку эта информация отсутствует, год будет 1970 (как в том же году, что и справочные данные).

Поскольку формат, сохраняемый в базе данных, полностью глуп, я предполагаю, что эти даты всегда находятся в течение следующих 365 дней. Таким образом, теоретически вам не нужно сохранять информацию за год.
Затем вы можете использовать что-то вроде этого, чтобы выяснить NSDate из этой совершенно неоднозначной информации о дате.
Идея состоит в том, чтобы перенести дату с 1970 года (созданную из вашей строки) на текущий год. И если это будет в прошлом для текущего года (например, сегодня 31 марта, дата с "Foo, 30 марта" будет в прошлом), перенесите его на следующий год.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"EEEE, MMMM d";
// the following line is important if you want that your code runs on device that are not english!
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSDate *date = [dateFormatter dateFromString:@"Wednesday, March 30"];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date];

NSDateComponents *todayComponent = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];

NSInteger proposedYear = [todayComponent year];
// if supposed date would be in the past for the current year move it into next year
if ([components month] < [todayComponent month]) {
    proposedYear++;
}
if ([components month] == [todayComponent month] && [components day] < [todayComponent day]) {
    proposedYear++;
}
[components setYear:proposedYear];

date = [calendar dateFromComponents:components];


// just for logging, so you are sure that you use the correct year:
[dateFormatter setDateFormat:@"EEEE, MMMM d yyyy"];
NSLog(@"%@", [dateFormatter stringFromDate:date]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...