使用 Swift 3,根据您的需要,您可以选择以下两种方式之一来解决您的问题。
1。向用户显示两个日期之间的差异
您可以使用DateComponentsFormatter 为您的应用界面创建字符串。 DateComponentsFormatter 有一个 maximumUnitCount 属性,声明如下:
var maximumUnitCount: Int { get set }
使用此属性来限制结果字符串中显示的单位数。例如,将此属性设置为 2,而不是“1h 10m, 30s”,结果字符串将是“1h 10m”。当您受到空间限制或想要将值四舍五入到最接近的大单位时,请使用此属性。
通过将maximumUnitCount 的值设置为1,您可以保证仅以DateComponentsFormatter 的一个单位(年、月、日、小时或分钟)显示差异。
下面的 Playground 代码显示了如何显示两个日期之间的差异:
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:) 的 Playground 代码显示了如何通过仅以一种类型的 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
}