【问题标题】:How to parse a human readable time expression (NSString) into NSTimeInterval?如何将人类可读的时间表达式(NSString)解析为 NSTimeInterval?
【发布时间】:2013-05-25 03:07:50
【问题描述】:

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

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

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

【问题讨论】:

  • 有人之前发布了一个答案(我不确定它发生了什么),说他们不知道图书馆,但提供了一些关于如何实现健壮方法的提示。虽然很感激,但我想我已经掌握了如何实现它。只需要大量代码才能做好,我发现没有人发布过这样的东西令人惊讶。

标签: objective-c parsing time expression


【解决方案1】:

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

+ (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;
}

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2013-07-24
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    相关资源
    最近更新 更多