在 swift 中添加时间字符串

Adding time Strings in swift

我有一个时间字符串数组,格式如下:

x 小时(秒)xx 分钟

我需要将这些加起来才能得出总数。我想知道最好的方法是什么?

我的想法是找到 "Hr(s)" 的索引。然后,如果我在索引 0 和 "Hr(s)" 的索引之间添加子字符串,我有我的 hrs var,然后将 6 添加到 "Hr(s)" 的索引并找到 "min" - 1 的索引,给我最小变量

然后我需要考虑秒数是否大于 60。因此,如果我将秒数变量除以 60 并且答案大于 1,我是否将该答案添加到我的小时数变量中?

有人能看出这个逻辑有什么缺陷吗?

示例实现:

JSON 回复:

    {"status":"OK","hrs":[{"scheduleDate":"2015-11-09","userName":"John Doe","company":"Company X","hrsWorked":"0 Hr(s) 42 min"},{"scheduleDate":"2015-11-10","userName":"Jane Doe","company":"Company Y","hrsWorked":"0 Hr(s) 47 min"},{"scheduleDate":"2015-11-10","userName":"Bob loblaw","company":"Company X","hrsWorked":"0 Hr(s) 37 min"},{"scheduleDate":"2015-11-10","userName":"Joe Soap","company":"Company Y","hrsWorked":"0 Hr(s) 50 min"},{"scheduleDate":"2015-11-10","userName":"Test","company":"Company Y","hrsWorked":"0 Hr(s) 40 min"}],"queryStatus":"OK","message":null,"count":5}

var hrsVar = 0
var minsVar = 0
loop through hrsArray{
    hrsMinStr = hrsWorkedInJson
    if let endHrsIndex = hrsMinStr.lowercaseString.characters.indexOf("Hr(s)") {
        print("Index: \(index)")
        let hrsStr = Int(hrsMinStr.substringWithRange(Range<String.Index>(start: 0, end: endHrsIndex)))

        hrsVar += hrsStr

        let minStr = Int(hrsMinStr.substringWithRange(Range<String.Index>(start: endHrsIndex + 1, end: hrsMinStr.length - 3)))
        minsVar += minStr

    }
}

if minsVar/60 > 1 {
   hrsVar = hrsVar + minsVar/60
   minsVar = minsVar%60
}

更新

好像我不能传入 "Hr(s)" 而只能传入一个字符 "h"。因此,我试图使用 advancedBy(x) 方法来获得正确的 endIndex。但我收到错误:

 Cannot invoke initializer for type 'Range<Index>' with an argument list of type '(start: Int, end: String.CharacterView.Index)'

更新代码:

if let endHrsIndex = hrsMinStr.lowercaseString.characters.indexOf("h") {
   print("Index: \(endHrsIndex)")
   let hrsStr = Int(hrsMinStr.substringWithRange(Range<String.Index>(start: 0, end: endHrsIndex)))

   hrsVar += hrsStr

   let minStr = Int(hrsMinStr.substringWithRange(Range<String.Index>(start: endHrsIndex.advancedBy(5), end: hrsMinStr.length.characters.count.advancedBy(-3))))
   minsVar += minStr
}

我真的在寻找尽可能最有效的方法,所以请告知是否有更好的方法way/if您发现此方法存在问题

您很可能应该尝试使用您的情况下的扫描仪。

        let string = "12 Hr(s) 37 min"
        let scanner = NSScanner(string: string)
        var min: Int = 0
        var hour : Int = 0
        scanner.scanInteger(&hour)
        scanner.scanString("Hr(s) ", intoString: nil)
        scanner.scanInteger(&min)

如果您在 Objective-C 中创建此部分,甚至更容易:

        int min, hour;
        sscanf("12 Hr(s) 37 min", "%d Hr(s) %d min", &hour, &min);
import Foundation
let str = "0 Hr(s) 42 min"
let time = str
    .stringByReplacingOccurrencesOfString("Hr(s)", withString:":")
    .stringByReplacingOccurrencesOfString("min", withString: "")
    .stringByReplacingOccurrencesOfString(" ", withString: "")
let t = time.characters.split(Character(":"))
let h = Int(String(t[0])) // 0
let m = Int(String(t[1])) // 1

求和

import Foundation

var time: [(hours:Int,minutes:Int,seconds:Int)] = []
for i in 0...5 {
    let h = Int(arc4random_uniform(24))
    let m = Int(arc4random_uniform(60))
    let s = Int(arc4random_uniform(60))
    time.append((h,m,s))
}
let t = time.reduce(0) { (sum, time: (hours: Int, minutes: Int, seconds: Int)) -> Int in
    sum + time.seconds + time.minutes * 60 + time.hours * 60 * 60
}


let seconds = t % 60
let minutes = ((t - seconds) / 60) % 60
let hours = ((t - seconds) / 3660)

time.forEach {
    print(String(format: "     %6d:%02d:%02d", arguments: [[=11=].hours,[=11=].minutes, [=11=].seconds]))
}
print("-------------------")
print(String(format: "Sum: %6d:%02d:%02d", arguments: [hours,minutes,seconds]))
/*

         12:25:04
          2:43:36
         14:09:35
         11:59:43
         10:39:19
         23:32:14
-------------------
Sum:     74:29:31

*/