一尘不染

在Swift中计算两个日期之间的时差

swift

我已经看到了许多方法,如何根据特定的日期组件(例如,天,小时,月等)来计算两个日期之间的差异

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?


阅读 1069

收藏
2020-07-07

共1个答案

一尘不染

我最终为创建了一个自定义运算符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`
     }
}

很可能这是我目前尚不了解的一些缺点,我很想听听您对此的想法。

2020-07-07