2010-08-14 1 views
2

Как я могу разобрать строку, которая представляет дату и/или время, используя iPhone SDK, если я не знаю формат? Я создаю приложение, которое позволит использовать ряд возможных дат и времени, и я не хочу, чтобы он терпел неудачу, потому что формат был «01/01/2001» вместо «01-01-2001» и т. Д. Время может быть или не быть включено.Как разобрать строку даты в неизвестном формате на iphone?

Есть ли способ сделать это? Я попытался использовать NSDateFormatter с стилями даты и времени, установленными на «NoStyle», и setLenient = YES, но он все еще не может проанализировать простейшую строку: «1/22/2009 12:00:00 PM»

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

Я исхожу из .NET-фона, где это так же просто, как новая DateTime (string_in_any_format); но я не знаю, как это сделать в Obj-C.

ответ

4

К сожалению, NSDateFormatter на iPhone не , что умный. Вам нужно дать ему небольшое руководство. Когда вы устанавливаете стили даты и времени на NoStyle, он не ожидает ни даты, ни времени. Вам понадобится хотя бы один из них, настроенный на какой-то другой стиль. Вы можете сделать что-то вроде следующего, и оно должно работать нормально (это для меня).

NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateStyle:NSDateFormatterLongStyle]; 
[formatter setTimeStyle:NSDateFormatterNoStyle]; 
[formatter setLenient:YES]; 

NSDate * date = [formatter dateFromString:@"01-01/2001"]; 

NSLog(@"%@", date); 
+0

Благодарим за помощь. Я мог видеть, что это будет полезно для создания, но, поскольку он, похоже, не предоставляется, я просто создам свой собственный. Пока я просто поддержу ограниченные форматы. –

0

Как ваш потенциальный парсер определит, если 01/02/10 - январь 2, 2010; feb 1, 2010; или что-то совсем другое? Bboth mm/dd/yy и dd/mm/yy разумно ожидать, в зависимости от того, где ваши клиенты.

+0

Парсер может принимать один формат или другой на основе языка, поэтому допустимо сделать это одно предположение. Однако это единственное приемлемое предположение. –

+0

Так что в основном то, о чем вы просите, так это то, как заставить парсер не делать никакой разницы между - и /? – erikkallen

2

Старый пост, но есть лучшие способы справиться с этим, что я нашел на других сообщениях.

Вы можете использовать метод как это:

  • Во-первых, попытаться разобрать дату в нескольких ожидаемых форматах.
  • Если это не помогает, используйте NSDataDetector, чтобы найти информацию о дате (ссылка: this SO post).

Вот пример кода, я использовал для этого (я ожидал формат даты пары, но не может быть уверен, что это единственная дата, я когда-либо видел и не хотите, чтобы потерпеть неудачу, если это возможно):

// your date formats may vary, the OP might try "MM/dd/yyyy" and "MM-dd-yyyy", along with combos that include time info 
NSArray *dateFormatsToTry = @[@"yyyy-MM-dd'T'HH:mmZZZZ", @"yyyy-MM-dd'T'HH:mm:ssZZZ"]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 

for (NSString * format in dateFormatsToTry) { 
    [dateFormatter setDateFormat:format]; 
    NSDate *date = [[[self class] sharedDateFormatter] dateFromString:dateString]; 
    if (date) { 
     return date; 
    } 
} 

// try and figure out the date if the all of the expected formats failed to 
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate error:nil]; 
NSTextCheckingResult *result = [detector firstMatchInString:dateString options:0 range:NSMakeRange(0, [dateString length])]; 
if ([result resultType] == NSTextCheckingTypeDate) { 
    NSDate * date = [result date]; 
    if (date) { 
     return date; 
    } 
} 

return [NSDate date]; // default to now :(