How to parse an ISO-8601 duration in Objective C?

前端 未结 12 672
清歌不尽
清歌不尽 2020-12-01 06:52

I\'m looking for an easy way to parse a string that contains an ISO-8601 duration in Objective C. The result should be something usable like a NSTimeI

12条回答
  •  一整个雨季
    2020-12-01 07:38

    slightly modifying function of the user

    Sergei Pekar

    + (NSString*)parseISO8601Time:(NSString*)duration
    {
        NSInteger hours = 0;
        NSInteger minutes = 0;
        NSInteger seconds = 0;
    
        //Get Time part from ISO 8601 formatted duration http://en.wikipedia.org/wiki/ISO_8601#Durations
        if ([duration rangeOfString:@"T"].location == NSNotFound || [duration rangeOfString:@"P"].location == NSNotFound) {
            NSLog(@"Time is not a part from ISO 8601 formatted duration");
            return @"0:00 Error";
        }
    
        duration = [duration substringFromIndex:[duration rangeOfString:@"T"].location];
    
        while ([duration length] > 1) { //only one letter remains after parsing
            duration = [duration substringFromIndex:1];
    
            NSScanner *scanner = [[NSScanner alloc] initWithString:duration];
            NSString *durationPart = [[NSString alloc] init];
            [scanner scanCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] intoString:&durationPart];
    
            NSRange rangeOfDurationPart = [duration rangeOfString:durationPart];
    
            if ((rangeOfDurationPart.location + rangeOfDurationPart.length) > duration.length) {
                NSLog(@"Time is not a part from ISO 8601 formatted duration");
                return @"0:00 Error";
            }
    
            duration = [duration substringFromIndex:rangeOfDurationPart.location + rangeOfDurationPart.length];
    
            if ([[duration substringToIndex:1] isEqualToString:@"H"]) {
                hours = [durationPart intValue];
            }
            if ([[duration substringToIndex:1] isEqualToString:@"M"]) {
                minutes = [durationPart intValue];
            }
            if ([[duration substringToIndex:1] isEqualToString:@"S"]) {
                seconds = [durationPart intValue];
            }
        }
    
        if (hours != 0)
            return [NSString stringWithFormat:@"%ld:%02ld:%02ld", (long)hours, (long)minutes, (long)seconds];
        else
            return [NSString stringWithFormat:@"%ld:%02ld", (long)minutes, (long)seconds];
    }
    

提交回复
热议问题