9

Я попытался получить NSDate из NSString с неведомому формате, поэтому я написал функцию, как показано нижеNSDate обнаружения с NSDataDetector

-(void)dateFromString:(NSString*)string { 

    NSError *error = NULL; 
    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:(NSTextCheckingTypes)NSTextCheckingTypeDate error:&error]; 

    NSArray *matches = [detector matchesInString:string 
             options:0 
              range:NSMakeRange(0, [string length])]; 

    NSLocale* currentLoc = [NSLocale currentLocale]; 
    for (NSTextCheckingResult *match in matches) { 
     if ([match resultType] == NSTextCheckingTypeDate) { 
      NSLog(@"Date : %@", [[match date] descriptionWithLocale:currentLoc]); 
     } 
    } 
} 

Он хорошо работает на одном месте, за исключением.

Если я призываю

[self dateFromString:@"6/12"]; 

Он печатает

Дата: Четверг, 12 июня , 2014 в 12:00:00 Australian Eastern Standard Time

В то же время, если я позвоню

[self dateFromString:@"13/12"]; 

печатает

Дата: Пятница, Декабрь 13, 2013 в 12:00:00 Австралийское восточное летнее время

В принципе, я хочу, чтобы функция вести себя в соответствии , Поскольку я живу в Австралии, он должен был вернуться 6 декабря для первой казни. Результат второго вызова правильный.

Что я здесь делаю неправильно?

+0

Почему вы не используете [NSDateFormatter] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html), он является гибким и вы можете легко решить эту проблему, так как вы можете установить формат строки даты. Вы задаете формат даты с помощью setDateFormat, а затем вы вызываете dateFromString: чтобы преобразовать строку в дату – mrt

+2

Я думаю, что нет подходящего способа обработки строки даты формата UNKNOWN. Вы должны определить формат строки даты – Joiningss

+0

Невероятно, как мой поиск в Google дал мне право на то, что я искал, наберите mate :) – petert0th

ответ

5

На самом деле метод, который я написал, работает очень хорошо :). К сожалению, формат области в моем тестовом телефоне был установлен в США и никогда не возвращался в Австралию: мой плохой.

@ joiningss: Бросьте некоторые случайные форматированные строки даты этим методам, и вы будете удивлены, как яблоко упростило разработчиков. В любом случае, большое вам спасибо.

@ mrt, Chavda & Грег: Большое спасибо, ребята. Я действительно ценю твою помощь.

0

Вы должны использовать NSDateFormatter. Попробуйте заменить, если заявление с:

if ([match resultType] == NSTextCheckingTypeDate) { 
    NSDate *dateAfter = [match date]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd 'at' HH:mm"]; 
    NSString *formattedDateString = [dateFormatter stringFromDate:dateAfter]; 
    NSLog(@"After: %@", formattedDateString); 
} 

Если вы хотите, чтобы отобразить его в другом формате, вы должны изменить эту строку в требуемый формат:

[dateFormatter setDateFormat:@"yyyy-MM-dd 'at' HH:mm"]; 

Если вы хотите, чтобы соответствовать вашему первому примеру изменения это:

[dateFormatter setDateFormat:@"EEEE, MMMM dd, yyyy 'at' HH:mm:ss a zzzz"];