2010-08-14 40 views
2

如何解析表示日期和/或時間使用iPhone SDK的字符串,如果我不知道格式?我正在構建一個允許使用一系列可能的日期和時間的應用程序,我不希望它失敗,因爲格式是「01/01/2001」而不是「01-01-2001」等。時間可能會或可能不會被包括在內。如何解析iphone上的未知格式的日期字符串?

有沒有辦法做到這一點?我曾嘗試使用日期和時間樣式設置爲「NoStyle」和setLenient = YES的NSDateFormatter,但它仍然無法解析最簡單的字符串:「2009年1月22日中午12:00:00」

I無法預先知道格式,我需要一種能夠啓發式確定格式的方法。

我來自.NET的背景,這就像新的DateTime(string_in_any_format)一樣簡單;但我不知道如何在Obj-C中做到這一點。

回答

4

不幸的是,iPhone上的NSDateFormatter不是聰明。你需要給它一點指導。當您將日期和時間樣式設置爲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

謝謝你的幫助。我可以看到,這將是一個有用的建設,但由於它似乎沒有提供,我會建立自己的。目前我只會支持有限的格式。 – 2010-08-14 22:04:13

0

您的潛在解析器將如何確定01/02/10是否是2010年1月2日; 2010年2月1日;或者完全不同的東西? Bboth mm/dd/yy和dd/mm/yy是合理的預期,取決於您的客戶在哪裏。

+0

解析器可以採用一種格式或基於語言環境的其他格式,因此可以接受這種假設。然而,這是唯一可以接受的假設。 – 2010-08-15 16:37:42

+0

因此,基本上你要求的是如何使解析器不會在 - 和/?之間產生任何區別。 – erikkallen 2010-08-15 17:32:40

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 :(