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