С Swift 3, в соответствии с вашими потребностями, вы можете выбрать один из двух следующих способов решения вашей проблемы.
1. Показать разницу между двумя датами для пользователя
Вы можете использовать DateComponentsFormatter
для создания строк для интерфейса вашего приложения. DateComponentsFormatter
имеет maximumUnitCount
свойство со следующим объявлением:
var maximumUnitCount: Int { get set }
Используйте это свойство, чтобы ограничить количество единиц, отображаемых в результирующей строке. Например, если для этого свойства установлено значение 2, а не «1 ч. 10 м., 30 с.», Результирующая строка будет «1 ч. 10 м.». Используйте это свойство, если вы ограничены в пространстве или хотите округлить значения до ближайшей большой единицы.
Установив 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
).