我试图计算两个时间之间的时差(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")
}
}
您应该避免使用像这样的硬编码值进行计算,其中涉及日期和时间。相反,使用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"
}
这样做意味着将为您处理夏令时等情况,但在这种情况下,由于您不知道发生警报的日期,您将无法知道夏令时是否适用。使用完整日期而不仅仅是时间真的会更好。
为什么你在(date2!) < (date1!)
的情况下尝试完全不同的表达?
尝试更改此行:
var elapsedTime = ((date2! + 86400000) - date1!)
至:
var elapsedTime = date1!.timeIntervalSince(date2!)