add all api to sort by month

This commit is contained in:
Michael Simard
2020-06-14 21:46:44 -05:00
parent 6b9e9a4c35
commit 842abb0895
162 changed files with 34480 additions and 71 deletions

View File

@@ -0,0 +1,82 @@
//
// 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)
}
}