如何获得从选定开始时间到选定结束时间的总时间(以小时和分钟为单位)?

How do I get the total time in hours and minutes from an selected start time to a selected end time?

我已经使用 DatePickers 为 startTime 和 EndTime 创建了一个 swiftui 表单。我想显示总数并将其从空字符串更新为小时和分钟(例如 10 小时 30 分钟)。

@State private var startTime = Date()
@State private var endTime = Date()
@State private var totalTime = differenceBetweenStartAndEndTimes

Form {
    DatePicker("Start Time", selection: $startTime, displayedComponents: .hourAndMinute)
    DatePicker("End Time", selection: $endTime, displayedComponents: .hourAndMinute)
    Text("Total: \(totalTime)")
}

我尝试使用 Date().offset(from: endTime, to: startTime) 并返回错误。

然后我尝试了来自 Whosebug 的这段代码:

func differenceBetweenStartAndEndTimes() {
let cal = Calendar.current
let components = cal.dateComponents([.hour], from: endTime, to: startTime)
let diff = components.hour!
}

仍然无法正常工作...我 2 个月前才开始学习如何编码,之前没有任何知识,所以它可能是非常简单的东西,我只是没有考虑!!

我认为您真的想使用日期格式化程序和时间间隔。查看代码中的注释,但您正在努力使变量具有您想要显示的内容。您可以简单地使显示本身按照您想要的方式进行格式化。您只需要保存实际时间间隔。

struct DateDifferences: View {
    
    @State private var startTime = Date()
    @State private var endTime = Date()
    var totalTime: TimeInterval {
        // This provides a time interval (difference between 2 dates in seconds as a Double
        endTime.timeIntervalSince(startTime)
    }

    // The DateComponentsFormatter handles how that time interval is displayed
    var dateFormatter: DateComponentsFormatter {
        let df = DateComponentsFormatter()
        // Limits the display to hours and mintues
        df.allowedUnits = [.hour, .minute]
        // Adds short units to hour and minutes as hr & min
        df.unitsStyle = .short
        return df
    }
    
    var body: some View {

        Form {
            DatePicker("Start Time", selection: $startTime, displayedComponents: .hourAndMinute)
            DatePicker("End Time", selection: $endTime, displayedComponents: .hourAndMinute)
            Text("Total: \(totalTime)")
            Text(dateFormatter.string(from: totalTime) ?? "")
        }
    }
}

这是 SwiftUI,如果您可以使用 hr 而不是 hrs

,那么在 SwiftUI 3 中有很多方便的本机格式化程序
Text("Total: " + (startTime..<endTime).formatted(.components(style: .narrow, fields: [.hour, .minute])))