// // SwiftDate // Parse, validate, manipulate, and display dates, time and timezones in Swift // // Created by Daniele Margutti // - Web: https://www.danielemargutti.com // - Twitter: https://twitter.com/danielemargutti // - Mail: hello@danielemargutti.com // // Copyright © 2019 Daniele Margutti. Licensed under MIT License. // import Foundation // MARK: - Math Operation DateInRegion - DateInRegion public func - (lhs: DateInRegion, rhs: DateInRegion) -> TimeInterval { return lhs.timeIntervalSince(rhs) } // MARK: - Math Operation DateInRegion - Date Components public func + (lhs: DateInRegion, rhs: DateComponents) -> DateInRegion { let nextDate = lhs.calendar.date(byAdding: rhs, to: lhs.date) return DateInRegion(nextDate!, region: lhs.region) } public func - (lhs: DateInRegion, rhs: DateComponents) -> DateInRegion { return lhs + (-rhs) } // MARK: - Math Operation DateInRegion - Calendar.Component public func + (lhs: DateInRegion, rhs: [Calendar.Component: Int]) -> DateInRegion { let cmps = DateInRegion.componentsFrom(values: rhs) return lhs + cmps } public func - (lhs: DateInRegion, rhs: [Calendar.Component: Int]) -> DateInRegion { var invertedCmps: [Calendar.Component: Int] = [:] rhs.forEach { invertedCmps[$0.key] = -$0.value } return lhs + invertedCmps } // MARK: - Internal DateInRegion Extension extension DateInRegion { /// Return a `DateComponent` object from a given set of `Calendar.Component` object with associated values and a specific region /// /// - parameter values: calendar components to set (with their values) /// - parameter multipler: optional multipler (by default is nil; to make an inverse component value it should be multipled by -1) /// - parameter region: optional region to set /// /// - returns: a `DateComponents` object internal static func componentsFrom(values: [Calendar.Component: Int], multipler: Int? = nil, setRegion region: Region? = nil) -> DateComponents { var cmps = DateComponents() if region != nil { cmps.calendar = region!.calendar cmps.calendar!.locale = region!.locale cmps.timeZone = region!.timeZone } values.forEach { pair in if pair.key != .timeZone && pair.key != .calendar { cmps.setValue( (multipler == nil ? pair.value : pair.value * multipler!), for: pair.key) } } return cmps } /// Adds a time interval to this date. /// WARNING: /// This only adjusts an absolute value. If you wish to add calendrical concepts like hours, /// days, months then you must use a Calendar. /// That will take into account complexities like daylight saving time, /// months with different numbers of days, and more. /// /// - Parameter timeInterval: The value to add, in seconds. public mutating func addTimeInterval(_ timeInterval: TimeInterval) { date.addTimeInterval(timeInterval) } }