我已经看到了许多方法,如何根据特定的日期组件(例如,天,小时,月等)来计算两个日期之间的差异
Calendar.current.dateComponents([.hour], from: fromDate, to: toDate).hour Calendar.current.dateComponents([.day], from: fromDate, to: toDate).day Calendar.current.dateComponents([.month], from: fromDate, to: toDate).month
我还没有看到的是如何使用实际Date对象进行计算。就像是
func computeNewDate(from fromDate: Date, to toDate: Date) -> Date let delta = toDate - fromDate let today = Date() if delta < 0 { return today } else { return today + delta } }
我已经看到了 iOS 10中引入的类型,但是根据文档DateInterval
[it]不支持反向间隔,即持续时间小于0且结束日期在时间上早于开始日期的间隔。
这样就很难计算日期,尤其是当您不知道哪个是较早的日期时。
是否有任何干净整洁的方法可以直接计算s之间Date的时间差(并将它们Date再次添加到实例中)而无需使用它们进行计算timeIntervalSinceReferenceDate?
我最终为创建了一个自定义运算符Date:
extension Date { static func - (lhs: Date, rhs: Date) -> TimeInterval { return lhs.timeIntervalSinceReferenceDate - rhs.timeIntervalSinceReferenceDate } }
使用此运算符,我现在可以在更抽象的级别上计算两个日期之间的差,而无需关心timeIntervalSinceReferenceDate或确切地知道参考日期是什么,并且也不会损失精度, 例如:
let delta = toDate - fromDate
显然,我并没有做太多改变,但是对我来说,它更具可读性和结果:Swift +已经为a Date和a 实现了运算符TimeInterval:
/// Returns a `Date` with a specified amount of time added to it. public static func + (lhs: Date, rhs: TimeInterval) -> Date
So it’s already supporting
Date + TimeInterval = Date
Consequently, it should also support
Date - Date = TimeInterval
我认为,这就是我对-操作符的简单实现所添加的内容。现在,我可以完全按照问题中的说明编写示例函数:
-
func computeNewDate(from fromDate: Date, to toDate: Date) -> Date let delta = toDate - fromDate // `Date` - `Date` = `TimeInterval` let today = Date() if delta < 0 { return today } else { return today + delta // `Date` + `TimeInterval` = `Date` } }
很可能这是我目前尚不了解的一些缺点,我很想听听您对此的想法。