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

前端 未结 12 675
清歌不尽
清歌不尽 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:27

    Here is swift 3 version of headkaze example: This format was most suitable in my case:

    private func parseISO8601Time(iso8601: String) -> String {
    
        let nsISO8601 = NSString(string: iso8601)
    
        var days = 0, hours = 0, minutes = 0, seconds = 0
        var i = 0
    
        while i < nsISO8601.length  {
    
            var str = nsISO8601.substring(with: NSRange(location: i, length: nsISO8601.length - i))
    
            i += 1
    
            if str.hasPrefix("P") || str.hasPrefix("T") { continue }
    
            let scanner = Scanner(string: str)
            var value = 0
    
            if scanner.scanInt(&value) {
    
                i += scanner.scanLocation - 1
    
                str = nsISO8601.substring(with: NSRange(location: i, length: nsISO8601.length - i))
    
                i += 1
    
                if str.hasPrefix("D") {
                    days = value
                } else if str.hasPrefix("H") {
                    hours = value
                } else if str.hasPrefix("M") {
                    minutes = value
                } else if str.hasPrefix("S") {
                    seconds = value
                }
            }
        }
    
        if days > 0 {
            hours += 24 * days
        }
    
        if hours > 0 {
            return String(format: "%d:%02d:%02d", hours, minutes, seconds)
        }
    
        return String(format: "%d:%02d", minutes, seconds)
    
    }
    

提交回复
热议问题