【问题标题】:How do I parse a date string in an unknown format on iphone?如何在 iphone 上解析未知格式的日期字符串?
【发布时间】:2010-08-14 21:35:32
【问题描述】:

如果我不知道格式,如何使用 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 中做到这一点。

【问题讨论】:

    标签: iphone date-parsing


    【解决方案1】:

    旧帖子,但我在其他帖子中发现了更好的方法来处理这个问题。

    你可以使用这样的方法:

    • 首先,尝试以几种预期格式解析日期。
    • 如果这不起作用,请使用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 :(
    

    【讨论】:

      【解决方案2】:

      不幸的是,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);
      

      【讨论】:

      • 感谢您的帮助。我可以看到这对构建会很有帮助,但是由于似乎没有提供,所以我将自己构建。暂时我只支持有限的格式。
      【解决方案3】:

      您的潜在解析器将如何确定 01/02/10 是否为 2010 年 1 月 2 日; 2010 年 2 月 1 日;还是完全不同的东西? mm/dd/yy 和 dd/mm/yy 都是合理的预期,具体取决于您的客户所在的位置。

      【讨论】:

      • 解析器可以根据语言环境假设一种或另一种格式,因此可以接受这种假设。然而,这是唯一可接受的假设。
      • 所以基本上你要问的是如何使解析器在 - 和 / 之间没有任何区别?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 2016-05-17
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多