Анализ NSString, чтобы найти дату

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

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

День недели, дата месяца

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

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

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


person random    schedule 30.03.2012    source источник
comment
База данных с неоднозначными датами. Я думаю, что этот проект не должен был существовать больше года. Удачи с этим ^^   -  person Matthias Bauch    schedule 31.03.2012


Ответы (2)


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

Поскольку формат, который сохраняется в базе данных, совершенно глуп, я предполагаю, что эти даты всегда находятся в пределах следующих 365 дней. Таким образом, теоретически вам не нужно было бы сохранять информацию о годе.
Затем вы могли бы использовать что-то вроде этого, чтобы выяснить NSDate из этой совершенно неоднозначной информации о дате.
Идея состоит в том, чтобы перенести дату из 1970 (созданного из вашей строки) в текущий год. И если это будет в прошлом для текущего года (например, сегодня 31 марта, дата с «Фу, 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]);
person Matthias Bauch    schedule 31.03.2012

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

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

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

person yuji    schedule 30.03.2012
comment
Это то, что я искал! Я не мог найти часть EEEE. И прошу прощения за двусмысленность. - person random; 31.03.2012
comment
У меня странная ошибка с этим, что я не уверен в причине. Я использую приведенный выше код для перехода к NSDate. Однако, когда я открываю его с помощью EventKit, месяц и числовая дата верны, но дата дня (например, вторник..) неверна. - person random; 31.03.2012
comment
Так, например, если я передаю строку, такую ​​​​как среда, 9 мая. Когда я передаю ее в EventKit, она отображается в субботу, 9 мая. - person random; 31.03.2012
comment
Средство форматирования даты делает все возможное с информацией, которую вы ему даете. Поскольку день недели не предоставляет никакой информации, кроме того, что делают месяц и дата, он игнорирует ее и просто дает день с этим месяцем и датой в этом году. Так что вполне возможно получить другой будний день. - person yuji; 31.03.2012
comment
в этом году не используется. Он использует 1970 год. И неожиданно, 9 мая 1970 года была суббота. И если вы хотите разобрать март, вам лучше установить локаль на @en_US. - person Matthias Bauch; 31.03.2012