我正在使用 DatePicker 撰寫一個 SwiftUI 應用程式,以根據持續時間確定作業的成本。我可以選擇開始/結束時間,但時間間隔函式似乎無法確定正確的持續時間。我只對小時和分鐘感興趣(如果可能的話,最好是軍用時間)并用這些時差進行數學運算。我的最終目標是根據完成作業的時間計算作業成本(以貨幣計)。
另外,在計算作業成本之前,如何將持續時間四舍五入到最接近的 15 分鐘?
到目前為止,這是我的代碼:
import SwiftUI
struct ContentView: View {
@State private var startTime = Date()
@State private var endTime = Date()
var body: some View {
NavigationView {
Form {
Section(header: Text("Enter Case Times:")) {
DatePicker("Start Time", selection: $startTime , displayedComponents: .hourAndMinute)
DatePicker("End Time", selection: $endTime, in: startTime..., displayedComponents: .hourAndMinute)
}
Section(header: Text("Dates Selected:")) {
Text("Start Time = \(startTime.formatted(date: .omitted, time: .shortened))")
Text("End Time = \(endTime.formatted(date: .omitted, time: .shortened))")
}
Section(header: Text("Case Duration:")) {
let diffTime = Int(endTime.timeIntervalSince1970 - startTime.timeIntervalSince1970)
let caseHours = diffTime / 3600
let caseMinutes = (diffTime % 3600) / 60
Text("\(diffTime) seconds = \(caseHours) h:\(caseMinutes) m")
let interval = DateInterval(start: startTime, end: endTime)
Text("duration = \(interval.duration)")
let durationHours = interval.duration / 3600
let durationMinutes =
(interval.duration.truncatingRemainder(dividingBy: 3600)) / 60
Text("\(durationHours) hrs: \(durationMinutes) m")
}
}
.navigationTitle("DDA Rates Calculator")
}
}
}
我嘗試使用 timeIntervalSince1970() 和 DateInterval() 函式,但時間似乎無法正常作業。例如,如果我選擇時間差 3 分鐘,它會輸出 158 秒,而應該是 180 秒。
uj5u.com熱心網友回復:
沒有必要使用timeIntervalSince1970或除法。你已經有一個TimeIntervalfrom DateInterval。您可以使用 aDateComponentsFormatter來獲取您的字串表示形式。
要獲得最接近的 15 分鐘,您可以將間隔除以 900 秒(15 分鐘),四舍五入,然后乘以 900 以回傳秒數。
我會使用計算變數,而不是在您的視圖代碼中包含所有這些程式代碼。
現在,為什么你有時會看到 4 分鐘而不是 5 分鐘?因為我使用的是游樂場,所以我最初無法重現這一點。當我將代碼移動到 iOS 應用程式中時,我重現了該問題。DatePicker這是由于兩種環境中的作業方式不同造成的:
請記住,aDate有一個秒值,即使您只顯示小時和分鐘。當您初始化時startTime,秒值不太可能為 00。它將類似于或其他任何東西,并且 start 和 end 都將具有相同的秒值,因為它們實際上是在同一時刻初始化的。endTimeDate()10:20:43
在操場上,DatePicker保留秒數,即使它們沒有顯示,所以如果我將結束時間更改為“10:25”,那么實際Date存盤的時間endTime將是“10:25:43” - 當我們計算差異時,我們得到5分鐘。
在 iOS 應用程式中,不保留秒數,因此DateinendTime為“10:25:00”,相差 257 秒,四舍五入到最接近的分鐘時顯示為 4 分鐘。如果您要更改開始時間和結束時間,并因此將兩個時間都設定為 00 作為其秒部分,那么它會突然開始按您的預期作業。
解決方案是用 00 秒初始化您的日期。一個擴展Date可以幫助我們:
xtension Date {
var zeroSeconds: Date {
let calendar = Calendar.current
let dateComponents = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: self)
return calendar.date(from: dateComponents) ?? self
}
}
然后我們可以在初始化時使用startTime它endTime
struct ContentView: View {
@State private var startTime = Date().zeroSeconds
@State private var endTime = Date().zeroSeconds
private var formatter:DateComponentsFormatter = {
let df = DateComponentsFormatter()
df.allowedUnits = [.day, .hour, .minute]
return df
}()
var body: some View {
NavigationView {
Form {
Section(header: Text("Enter Case Times:")) {
DatePicker("Start Time", selection: $startTime , displayedComponents: .hourAndMinute)
DatePicker("End Time", selection: $endTime, in: startTime..., displayedComponents: .hourAndMinute)
}
Section(header: Text("Dates Selected:")) {
Text("Start Time = \(startTime.formatted(date: .omitted, time: .shortened))")
Text("End Time = \(endTime.formatted(date: .omitted, time: .shortened))")
}
Section(header: Text("Case Duration:")) {
Text("duration = \(self.durationStr) \(self.duration)")
Text("duration (15m) = \(self.duration15Str) \(self.duration15)")
}
}
.navigationTitle("DDA Rates Calculator")
}
}
var duration: TimeInterval {
guard endTime > startTime else {
return 0
}
return DateInterval(start: startTime, end: endTime).duration
}
var durationStr: String {
let duration = self.duration
guard duration > 1 else {
return "----"
}
return formatter.string(from: duration) ?? "----"
}
var duration15: TimeInterval {
return (self.duration/900.0).rounded(.up)*900
}
var duration15Str: String {
let duration = duration15
guard duration > 1 else {
return "----"
}
return formatter.string(from: duration) ?? "----"
}
}

uj5u.com熱心網友回復:
首先,我想我想出了如何發布圖片。但是我必須使用“發布您的答案”按鈕而不是“添加評論”,這有點令人困惑。
但是,如果我對您的理解正確,則您更改了上面發布的代碼。所以我重新編譯了那個代碼,答案似乎比以前更糟。
例如,對于 4 分鐘的時間間隔,我得到以下資訊:
在此處輸入影像描述
那么這是什么意思?它似乎無法正常作業。請記住,在計算持續時間之后,我需要將其代入貨幣公式。所以我認為時間需要是雙精度而不是字串型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/530624.html
標籤:IOS迅捷
