Benutzer können Artikel verkaufen und ein Ablaufdatum hinzufügen, das von 1-3 Wochen ab dem aktuellen Datum abweicht.Countdown vom aktuellen Datum bis zum bestimmten Datum Swift
So speichern Sie das Ablaufdatum als Double
. Muss ich explizit über andere Datumskomponenten wie Jahr, Monat usw. sprechen? Diese
enum Weeks: Int {
case one
case two
case three
}
extension Weeks {
var timeInterval: Double? {
let currentDate = Date()
let calendar = Calendar.current
let calendarComponents: Set<Calendar.Component> = Set(arrayLiteral: Calendar.Component.year, Calendar.Component.month, Calendar.Component.day, Calendar.Component.hour, Calendar.Component.minute, Calendar.Component.second)
var components = calendar.dateComponents(calendarComponents, from: currentDate)
switch self {
case .one: components.weekOfMonth = 1
case .two: components.weekOfMonth = 2
case .three: components.weekOfMonth = 3
}
if let expirationDate = calendar.date(from: components) {
return expirationDate.timeIntervalSince1970 as Double
} else {
return nil
}
}
}
ist, wie ich den Countdown in Date
Erweiterung berechnen:
func countdown(to date: Date) -> CountdownResponse {
let difference = Calendar.current.dateComponents([.day, .hour, .minute, .second], from: self, to: date)
guard let day = difference.day, let hour = difference.hour, let minute = difference.minute, let second = difference.second else {
return .error(message: "One or more date components are nil.")
}
if day <= 0 && hour <= 0 && minute <= 0 && second <= 0 {
return .isFinished
}
let days = displayableText(from: difference.day)
let hours = displayableText(from: difference.hour)
let minutes = displayableText(from: difference.minute)
let seconds = displayableText(from: difference.second)
let timeRemaining = "\(days) : \(hours) : \(minutes) : \(seconds)"
return .result(time: timeRemaining)
}
Dies ist, wie ich möchte den Countdown bekommen, und dann überprüfe ich die Antwort Enum für Fehler oder Ergebnis. Aber das gibt mir falsche Zeit.
Wenn ich Datum manuell erstelle und wie folgt teste, funktioniert es wie erwartet.
var comp = calendar.dateComponents(calendarComponents, from: Date())
comp.year = 2017
comp.month = 8
comp.day = 24
comp.minute = 50
comp.second = 30
Was mache ich falsch? Behalte ich das Datum als falsches Zeitintervall oder das Datum falsch von timeInterval?
Als ich über den Code schaue, merke ich, dass ich die Woche falsch berechnen kann. Wenn es die zweite Woche des Monats ist und ein Nutzer wählt, dass der Artikel in 3 Wochen abläuft, sollte die Woche des Monats nicht 3 sein, sondern 3 Wochen ab der aktuellen Woche des Monats. Jede Anleitung zur Behebung dieser Logik wird begrüßt.
Auf einen flüchtigen Blick muss ich fragen ... warum machen Sie die Berechnungen so kompliziert? Siehe https://stackoverflow.com/questions/29465205/how-to-add-minutes-to-current-time-in-swift und https://developer.apple.com/documentation/foundation/calendar. Für mich sieht es so aus, als wäre alles, was Sie brauchen, eingebaut. – solenoid