З Swift 3, відповідно до ваших потреб, ви можете вибрати один із двох наступних способів вирішити свою проблему.
1. Покажіть користувачеві різницю між двома датами
Ви можете використовувати a DateComponentsFormatter
для створення рядків для інтерфейсу програми. DateComponentsFormatter
має maximumUnitCount
властивість із такою декларацією:
var maximumUnitCount: Int { get set }
Використовуйте це властивість для обмеження кількості одиниць, що відображаються в отриманому рядку. Наприклад, при цьому властивості, встановленому на 2, замість "1h 10m, 30s", результуюча рядок буде "1h 10m". Використовуйте це властивість, якщо у вас обмежено місце або ви хочете округлити значення до найближчого великого одиниці.
Встановивши maximumUnitCount
значення для 1
, ви гарантовано відображатимете різницю лише в одномуDateComponentsFormatter
одиниці (роки, місяці, дні, години або хвилини).
Код ігрового майданчика нижче показує, як відобразити різницю між двома датами:
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")
Зауважте, що DateComponentsFormatter
округлює результат. Тому різниця в 4 години та 30 хвилин відображатиметься як 5 годин .
Якщо вам потрібно повторити цю операцію, ви можете знову змінити код:
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. Отримайте різницю між двома датами без форматування
Якщо вам не потрібно показувати користувачеві різницю між двома датами, ви можете використовувати Calendar
. Calendar
має методdateComponents(_:from:to:)
який містить таку заяву:
func dateComponents(_ components: Set<Calendar.Component>, from start: Date, to end: Date) -> DateComponents
Повертає різницю між двома датами.
Код ігрової площадки, який використовується нижче, dateComponents(_:from:to:)
показує, як відновити різницю між двома датами, повернувши різницю лише в одному типіCalendar.Component
(роки, місяці, дні, години або хвилини).
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
}
}
Якщо вам потрібно повторити цю операцію, ви можете знову змінити код:
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
. Це дуже настроюється, що дозволяє отримувати належним чином короткочасні результати (наприклад.maximumUnitCount = 1
).