在Swift 4中计算时差

时间:2018-06-26 00:56:21

标签: swift

如果我有两个变量“ 10:30”和另一个“ 1:20”,有没有办法得到它们之间的“ 2小时50分钟”的时差?我在下面尝试过

func calcTime(time1: String,time2: String) -> String {
    let time12 = (String(format: "%02d", time1))
    let time22 = (String(format: "%02d", time2))

    let time10 = time12.prefix(2)
    let time20 = time22.prefix(2)

    print("hours: \(time12)")
    print("minutes: \(time22)")

    let time11 = time1.suffix(2)
    let time21 = time2.suffix(2)

    var hours = 12 - Int(time10)! + Int(time20)!
    var minutes = Int(time11)! + Int(time21)!

    if minutes > 60 {
        hours += 1
        minutes -= 60
    }

    let newHours = (String(format: "%02d", hours))
    let newMin = (String(format: "%02d", minutes))

   return "\(newHours)hrs. \(newMin)min."
}

这并不是我想要的那样。

2 个答案:

答案 0 :(得分:2)

首先,您的数学是错误的。 10:30-> 1:20实际上是2小时50分钟。其次,您需要指定AM或PM,或使用24小时制(军用风格)时钟。最后,解决方案是使用DateFormatter将字符串转换为Date值,并使用这些值获取时差,然后可以将其转换为小时/分钟。

    let time1 = "10:30AM"
    let time2 = "1:20PM"

    let formatter = DateFormatter()
    formatter.dateFormat = "h:mma"

    let date1 = formatter.date(from: time1)!
    let date2 = formatter.date(from: time2)!

    let elapsedTime = date2.timeIntervalSince(date1)

    // convert from seconds to hours, rounding down to the nearest hour
    let hours = floor(elapsedTime / 60 / 60)

    // we have to subtract the number of seconds in hours from minutes to get
    // the remaining minutes, rounding down to the nearest minute (in case you
    // want to get seconds down the road)
    let minutes = floor((elapsedTime - (hours * 60 * 60)) / 60)

    print("\(Int(hours)) hr and \(Int(minutes)) min")

答案 1 :(得分:0)

让我们看一下您的一些代码,看看它会产生奇怪的结果:

let time12 = (String(format: "%02d", time1))

这行没有意义,格式%02d表示要格式化的值(转换为String表示形式)是整数,并且转换应为2位数宽且前导零。但是,您的参数time1是一个String值,而不是整数。

不幸的是,斯威夫特并没有向您指出这个错误,而是会咬人。由于String(format:...)的工作方式–需要可变数量的参数–放弃了通常的Swift快速类型检查,而您得到的只是{{1}机器地址的十进制表示形式(可能是其中一部分) }}。在Playground中多次运行您的代码,您将获得不同的答案!

因此,在使用time1时要非常小心。

目前尚不清楚您要对上述行进行什么操作,您有一个String(format:...)值,并希望从中提取两个整数值,所以为什么要先生成一个String({{ 1}})?

String

跳过混淆哪个变量(let time12 = String(...time1...)let time10 = time12.prefix(2) let time11 = time1.suffix(2) )包含您的time12的情况,这里您假设字符串的格式完全相同;但是您的测试字符串之一是time1,因此,即使这些语句引用了正确的变量,在这种情况下,您最终也会得到String"1:20"

您可以执行以下操作,将字符串分为两部分:使用"1:"的{​​{1}}函数,有关详细说明,请查阅文档。在这里您可以写:

"20"

对于您的两个测试字符串,将输出:

String

现在,您应该检查每个数组(split(separator:maxSplits:omittingEmptySubsequences:)let time1parts = time1.split(separator: ":", omittingEmptySubsequences:false) let time2parts = time2.split(separator: ":", omittingEmptySubsequences:false) print("\(time1) -> \(time1parts)") print("\(time2) -> \(time2parts)") )是否正好包含两个元素,作为练习。

已完成操作,可以将元素转换为无符号整数(以防万一有人键入减号)。例如:

10:30 -> ["10", "30"]
1:20 -> ["1", "20"]

这将输出:

time1parts

现在,您需要检查可选的(time2parts)值是否不是let hours1 = UInt(time1parts[0]) let minutes1 = UInt(time1parts[1]) print("\(String(describing: hours1)) | \(String(describing: minutes1))") ,并且每个值都在正确的范围内(例如,分钟数为0到59,Optional(10) | Optional(30) 类型和方法Uint?可能会对您有所帮助)并进行数学计算。

注意:您确实有一个问题,因为您假设nil是PM,您需要解决这个问题,您的数学永远是不正确的。也许使用24小时制(Range)?

如果您继续前进,请提出一个新问题,以显示您已开发的代码并解释您的问题,无疑会有人帮助您。