我试图计算两个时间之间的时差(x hrs x mins),当前时间以及用户使用时间选择器设置的时间。
我会收到一个负值,例如-7小时30分钟。
要解决此问题,我已阅读到我将需要包含if语句。但是,我收到以下错误,无法解决: “无法将类型为“日期”的值转换为预期的参数类型为“时间间隔”(又名“双精度”)”
非常感谢您的帮助,谢谢!
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")
}
}
答案 0 :(得分: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"
}
这样做意味着将为您处理诸如夏令时之类的情况,尽管在这种情况下,由于您不知道发生警报的日期,因此您将无法知道是否采用夏令时或不。最好使用完整日期而不是仅仅使用时间。
答案 1 :(得分:0)
为什么在(date2!) < (date1!)
的情况下尝试使用完全不同的表达式?
尝试更改此行:
var elapsedTime = ((date2! + 86400000) - date1!)
收件人:
var elapsedTime = date1!.timeIntervalSince(date2!)