2

所以说我有一个 NSString,它有一个人类可读的时间表达式,比如@“10 分钟”或@“2 小时”。是否有一个客观的 C 库可以帮助我将其解析为 NSTimeInterval?(或 C 库或其他任何我可以在 iOS 应用程序中轻松使用的东西)。

我写了一个方法来处理简单的情况。上面的简单案例都不是太难,如果没有人有任何建议,这就是我将采取的方向。但是我的代码对输入做了很多假设。我的代码目前不会解析@“十分半钟”或@“5 horas”。(与往常一样,日期和时间函数总是比最初出现的要困难。)

我在 Google、Stack Exchange 和 GitHub 上进行了一些搜索,但到目前为止我发现的唯一内容是解析日期(不是时间间隔)和解析 ISO-8601 持续时间(假设输入非常具体)。

4

1 回答 1

0

对于它的价值,我想我会发布我最终使用的代码。它并没有真正回答这个问题,因为它只处理非常简单的情况。对于我的用例来说,它已经足够好了,但我仍然希望看到一个更强大的库。

+ (NSTimeInterval)timeIntervalFromString:(NSString *)string {
    NSTimeInterval interval    = 0.0;
    NSError *error = NULL;
    NSString *pattern          = @"^\\s*(\\d+)\\s+(second|minute|hour|day)s?\\s*$";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:&error];
    NSTextCheckingResult *matchResult = [regex firstMatchInString:string
                                                          options:NSMatchingAnchored
                                                            range:NSMakeRange(0, [string length])];

    if(matchResult != nil) {
        NSString *numberString = [string substringWithRange:[matchResult rangeAtIndex:1]];
        NSString *unitString   = [string substringWithRange:[matchResult rangeAtIndex:2]];

        if([[unitString lowercaseString] isEqualToString:@"second"]) {
            interval = [numberString floatValue];
        } else if([[unitString lowercaseString] isEqualToString:@"minute"]) {
            interval = [numberString floatValue] * 60;
        } else if([[unitString lowercaseString] isEqualToString:@"hour"]) {
            interval = [numberString floatValue] * 3600;
        } else if([[unitString lowercaseString] isEqualToString:@"day"]) {
            interval = [numberString floatValue] * 3600 * 24;
        }
    }
    return interval;
}
于 2013-05-24T19:07:50.493 回答