试图计算时差,但我得到了否定答案

问题描述 投票:0回答:2

我试图计算两个时间之间的时差(x小时和分钟),当前时间和用户使用时间戳设置的时间。

我会收到负值,例如-7小时30分钟。

为了解决这个问题,我已经读过我需要包含if语句。但是,我收到以下错误,我无法解决它:“无法将'Date'类型的值转换为预期的参数类型'TimeInterval'(又名'Double')”

非常感谢一些帮助,谢谢!

func findTimeDiff() {
    let time1 = currentTimeOutlet
    let time2 = alarmTimeOutlet

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

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

    var elapsedTime = date2!.timeIntervalSince(date1!)
    let hours = floor(elapsedTime / 60 / 60)
    let minutes = floor((elapsedTime - (hours * 60 * 60)) / 60)

    if (date2!) < (date1!) {

        var elapsedTime = ((date2! + 86400000) - date1!)
        let hours = floor(elapsedTime / 60 / 60)
        let minutes = floor((elapsedTime - (hours * 60 * 60)) / 60)
        timeDiffOutlet.text = ("\(Int(hours)) hr and \(Int(minutes)) min")
    }
    else {
        var elapsedTime = date2!.timeIntervalSince(date1!)
        let hours = floor(elapsedTime / 60 / 60)
        let minutes = floor((elapsedTime - (hours * 60 * 60)) / 60)
        timeDiffOutlet.text = ("\(Int(hours)) hr and \(Int(minutes)) min")

    }
}
swift user-interface elapsedtime
2个回答
1
投票

您应该避免使用像这样的硬编码值进行计算,其中涉及日期和时间。相反,使用Calendar类为您提供的方法要好得多。

所以像这样:

func findTimeDiff2() {
    let time1 = currentTimeOutlet
    let time2 = alarmTimeOutlet

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

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

    let components = Calendar.current.dateComponents([.hour, .minute], from: date1!, to: date2!)

    timeDiffOutlet.text = "\(abs(components.hour!)) hr and \(abs(components.minute!)) min"
}

这样做意味着将为您处理夏令时等情况,但在这种情况下,由于您不知道发生警报的日期,您将无法知道夏令时是否适用。使用完整日期而不仅仅是时间真的会更好。


0
投票

为什么你在(date2!) < (date1!)的情况下尝试完全不同的表达?

尝试更改此行:

var elapsedTime = ((date2! + 86400000) - date1!)

至:

var elapsedTime = date1!.timeIntervalSince(date2!)
© www.soinside.com 2019 - 2024. All rights reserved.