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,69 @@
//
// 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
public class DOTNETParser: StringToDateTransformable {
internal static let pattern = "\\/Date\\((-?\\d+)((?:[\\+\\-]\\d+)?)\\)\\/"
public static func parse(_ string: String) -> (seconds: TimeInterval, tz: TimeZone)? {
do {
let parser = try NSRegularExpression(pattern: DOTNETParser.pattern, options: .caseInsensitive)
guard let match = parser.firstMatch(in: string, options: .reportCompletion, range: NSRange(location: 0, length: string.count)) else {
return nil
}
guard let milliseconds = TimeInterval((string as NSString).substring(with: match.range(at: 1))) else { return nil }
// Parse timezone
let raw_tz = ((string as NSString).substring(with: match.range(at: 2)) as NSString)
guard raw_tz.length > 1 else {
return nil
}
let tz_sign: String = raw_tz.substring(to: 1)
if tz_sign != "+" && tz_sign != "-" {
return nil
}
let tz_hours: String = raw_tz.substring(with: NSRange(location: 1, length: 2))
let tz_minutes: String = raw_tz.substring(with: NSRange(location: 3, length: 2))
let tz_offset = (Int(tz_hours)! * 60 * 60) + ( Int(tz_minutes)! * 60 )
guard let tz_obj = TimeZone(secondsFromGMT: tz_offset) else {
return nil
}
return ( (milliseconds / 1000), tz_obj )
} catch {
return nil
}
}
public static func parse(_ string: String, region: Region?, options: Any?) -> DateInRegion? {
guard let result = DOTNETParser.parse(string) else { return nil }
let regionSet = region ?? Region.ISO
let adaptedRegion = Region(calendar: regionSet.calendar, zone: regionSet.timeZone, locale: regionSet.locale)
return DateInRegion(seconds: result.seconds, region: adaptedRegion)
}
}
public class DOTNETFormatter: DateToStringTrasformable {
public static func format(_ date: DateRepresentable, options: Any?) -> String {
let milliseconds = (date.date.timeIntervalSince1970 * 1000.0)
let tzOffsets = (date.region.timeZone.secondsFromGMT(for: date.date) / 3600)
let formattedStr = String(format: "/Date(%.0f%+03d00)/", milliseconds, tzOffsets)
return formattedStr
}
}