我该如何在iPhone上解析一个未知格式的日期字符串?

3
如何在iPhone SDK中解析一个表示日期和/或时间的字符串,如果我不知道格式呢? 我正在构建一个应用程序,允许使用一系列可能的日期和时间,并且我不希望它因为格式是“01/01/2001”而不是“01-01-2001”等而失败。 时间可能包含也可能不包含。
有什么办法可以做到这一点吗? 我已经尝试使用NSDateFormatter,将日期和时间样式设置为“NoStyle”,并将setLenient = YES,但它仍然无法解析最简单的字符串:“1/22/2009 12:00:00 PM”
我没有预先知道格式的方法,我需要一种可以启发式确定格式的方法。
我来自.NET背景,那里这就像new DateTime(string_in_any_format)一样简单;但我不知道如何在Obj-C中做到这一点。
3个回答

5

虽然这是一篇旧帖子,但我在其他帖子中找到了更好的处理方法。

您可以使用以下方法:

  • 首先,尝试在几个预期的格式中解析日期。
  • 如果不起作用,请使用NSDataDetector来查找日期信息(参考:此SO帖子)。

下面是我用于此目的的代码示例(我期望有几种日期格式,但不能确定这是我可能看到的唯一日期,如果可能的话,我不想失败):

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

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);

谢谢你的帮助。我能看出这是一个有用的构建,但由于似乎没有提供,我将自己构建。暂时我只支持有限的格式。 - Dan Berlin

0
你的潜在解析器如何确定01/02/10是2010年1月2日、2010年2月1日还是完全不同的日期?无论客户在哪里,mm/dd/yy和dd/mm/yy都是可以预期的合理格式。

1
解析器可以根据区域设置假设一种格式或另一种格式,因此做出这种假设是可以接受的。然而,这是唯一可接受的假设。 - Dan Berlin
所以基本上你要求的是如何使解析器在处理 - 和 / 时不产生任何区别? - erikkallen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接