Mit Swift 3 können Sie je nach Bedarf eine der beiden folgenden Möglichkeiten wählen, um Ihr Problem zu lösen.
1. Zeigen Sie dem Benutzer die Differenz zwischen zwei Daten an
Mit a können Sie DateComponentsFormatter
Zeichenfolgen für die Benutzeroberfläche Ihrer App erstellen. DateComponentsFormatter
hat eine maximumUnitCount
Eigenschaft mit der folgenden Deklaration:
var maximumUnitCount: Int { get set }
Verwenden Sie diese Eigenschaft, um die Anzahl der Einheiten zu begrenzen, die in der resultierenden Zeichenfolge angezeigt werden. Wenn diese Eigenschaft beispielsweise auf 2 gesetzt ist, lautet die resultierende Zeichenfolge anstelle von "1h 10m, 30s" "1h 10m". Verwenden Sie diese Eigenschaft, wenn Sie Platzmangel haben oder Werte auf die nächste große Einheit aufrunden möchten.
Wenn Sie den maximumUnitCount
Wert auf setzen 1
, wird garantiert, dass der Unterschied nur in einem angezeigt wirdDateComponentsFormatter
Einheit (Jahre, Monate, Tage, Stunden oder Minuten).
Der folgende Spielplatzcode zeigt, wie der Unterschied zwischen zwei Daten angezeigt wird:
import Foundation
let oldDate = Date(timeIntervalSinceReferenceDate: -16200)
let newDate = Date(timeIntervalSinceReferenceDate: 0)
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.allowedUnits = [NSCalendar.Unit.year, .month, .day, .hour, .minute]
dateComponentsFormatter.maximumUnitCount = 1
dateComponentsFormatter.unitsStyle = DateComponentsFormatter.UnitsStyle.full
let timeDifference = dateComponentsFormatter.string(from: oldDate, to: newDate)
print(String(reflecting: timeDifference)) // prints Optional("5 hours")
Beachten Sie, dass DateComponentsFormatter
das Ergebnis aufgerundet wird. Daher wird eine Differenz von 4 Stunden und 30 Minuten als 5 Stunden angezeigt .
Wenn Sie diesen Vorgang wiederholen müssen, können Sie Ihren Code umgestalten:
import Foundation
struct Formatters {
static let dateComponentsFormatter: DateComponentsFormatter = {
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.allowedUnits = [NSCalendar.Unit.year, .month, .day, .hour, .minute]
dateComponentsFormatter.maximumUnitCount = 1
dateComponentsFormatter.unitsStyle = DateComponentsFormatter.UnitsStyle.full
return dateComponentsFormatter
}()
}
extension Date {
func offset(from: Date) -> String? {
return Formatters.dateComponentsFormatter.string(from: oldDate, to: self)
}
}
let oldDate = Date(timeIntervalSinceReferenceDate: -16200)
let newDate = Date(timeIntervalSinceReferenceDate: 0)
let timeDifference = newDate.offset(from: oldDate)
print(String(reflecting: timeDifference)) // prints Optional("5 hours")
2. Ermitteln Sie den Unterschied zwischen zwei Daten ohne Formatierung
Wenn Sie dem Benutzer den Unterschied zwischen zwei Daten nicht formatieren müssen, können Sie ihn verwenden Calendar
. Calendar
hat eine Methode dateComponents(_:from:to:)
mit der folgenden Deklaration:
func dateComponents(_ components: Set<Calendar.Component>, from start: Date, to end: Date) -> DateComponents
Gibt die Differenz zwischen zwei Daten zurück.
Der unten verwendete Spielplatzcode dateComponents(_:from:to:)
zeigt, wie Sie die Differenz zwischen zwei Daten abrufen können, indem Sie die Differenz in nur einem Typ Calendar.Component
(Jahre, Monate, Tage, Stunden oder Minuten) zurückgeben.
import Foundation
let oldDate = Date(timeIntervalSinceReferenceDate: -16200)
let newDate = Date(timeIntervalSinceReferenceDate: 0)
let descendingOrderedComponents = [Calendar.Component.year, .month, .day, .hour, .minute]
let dateComponents = Calendar.current.dateComponents(Set(descendingOrderedComponents), from: oldDate, to: newDate)
let arrayOfTuples = descendingOrderedComponents.map { ($0, dateComponents.value(for: $0)) }
for (component, value) in arrayOfTuples {
if let value = value, value > 0 {
print(component, value) // prints hour 4
break
}
}
Wenn Sie diesen Vorgang wiederholen müssen, können Sie Ihren Code umgestalten:
import Foundation
extension Date {
func offset(from: Date) -> (Calendar.Component, Int)? {
let descendingOrderedComponents = [Calendar.Component.year, .month, .day, .hour, .minute]
let dateComponents = Calendar.current.dateComponents(Set(descendingOrderedComponents), from: from, to: self)
let arrayOfTuples = descendingOrderedComponents.map { ($0, dateComponents.value(for: $0)) }
for (component, value) in arrayOfTuples {
if let value = value, value > 0 {
return (component, value)
}
}
return nil
}
}
let oldDate = Date(timeIntervalSinceReferenceDate: -16200)
let newDate = Date(timeIntervalSinceReferenceDate: 0)
if let (component, value) = newDate.offset(from: oldDate) {
print(component, value) // prints hour 4
}
NSDateComponentsFormatter
. Es ist sehr konfigurierbar, sodass Sie entsprechend knappe Ergebnisse erzielen können (z.maximumUnitCount = 1
. B. ).