Calculating the difference between two dates in Swift Calculating the difference between two dates in Swift ios ios

# Calculating the difference between two dates in Swift

I ended up creating a custom operator for `Date`:

``extension Date {    static func - (lhs: Date, rhs: Date) -> TimeInterval {        return lhs.timeIntervalSinceReferenceDate - rhs.timeIntervalSinceReferenceDate    }}``

With this operator I can now compute the difference between two dates on a more abstract level without caring about `timeIntervalSinceReferenceDate` or what exactly the reference date is – and without losing precision, for example:

``let delta = toDate - fromDate``

Obviously, I didn't change much, but for me it's a lot more readable and consequent: Swift has the `+` operator already implemented for a `Date` and a `TimeInterval`:

``/// Returns a `Date` with a specified amount of time added to it.public static func + (lhs: Date, rhs: TimeInterval) -> Date``

``Date + TimeInterval = Date``

Consequently, it should also support

``Date - Date = TimeInterval``

in my opinion and that's what I added with the simple implementation of the `-` operator. Now I can simply write the example function exactly as mentioned in my question:

``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`     }}``

It might very well be that this has some downsides that I'm not aware of at this moment and I'd love to hear your thoughts on this.

You can extension with custom operator, and return tuples

``extension Date {    static func -(recent: Date, previous: Date) -> (month: Int?, day: Int?, hour: Int?, minute: Int?, second: Int?) {        let day = Calendar.current.dateComponents([.day], from: previous, to: recent).day        let month = Calendar.current.dateComponents([.month], from: previous, to: recent).month        let hour = Calendar.current.dateComponents([.hour], from: previous, to: recent).hour        let minute = Calendar.current.dateComponents([.minute], from: previous, to: recent).minute        let second = Calendar.current.dateComponents([.second], from: previous, to: recent).second        return (month: month, day: day, hour: hour, minute: minute, second: second)    }}``

Using:

``let interval = Date() - updatedDateprint(interval.day)print(interval.month)print(interval.hour)``

``func computeNewDate(from fromDate: Date, to toDate: Date) -> Date  {       let delta = toDate.timeIntervalSince(fromDate)      let today = Date()     if delta < 0 {         return today     } else {         return today.addingTimeInterval(delta)      }}`` 