Skip to content

Instantly share code, notes, and snippets.

@robnadin
Created March 8, 2016 16:44
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save robnadin/f3cfd06095b085f5e132 to your computer and use it in GitHub Desktop.
Save robnadin/f3cfd06095b085f5e132 to your computer and use it in GitHub Desktop.
Fast C-based ISO8601 date parser written in Swift
import Foundation
extension NSDate {
class func dateFromISO8601String(string: String?) -> NSDate? {
guard let string = string else {
return nil
}
var tm = Darwin.tm()
strptime(string.cStringUsingEncoding(NSUTF8StringEncoding)!, "%Y-%m-%dT%H:%M:%S%z", &tm)
tm.tm_isdst = -1
let t = mktime(&tm)
return NSDate(timeIntervalSince1970: NSTimeInterval(t + NSTimeZone.localTimeZone().secondsFromGMT))
}
var ISO8601String: String? {
var buffer = CChar(80)
var rawtime = Int(timeIntervalSince1970) - NSTimeZone.localTimeZone().secondsFromGMT
let timeinfo = localtime(&rawtime)
strftime(&buffer, 80, "%Y-%m-%dT%H:%M:%S%z", timeinfo)
return String(CString: &buffer, encoding: NSUTF8StringEncoding)
}
}
let aDate = NSDate.dateFromISO8601String("2016-03-06T06:36:09Z")
let aString = aDate?.ISO8601String
@Pulichev
Copy link

Thank you, sir

@hauensteina
Copy link

DateFormatter never again. Thank you!

@robinstewart
Copy link

Rather than convert to local time and then back to GMT, use this in dateFromISO8601String:

let t = timegm(&tm)
return Date(timeIntervalSince1970: TimeInterval(t))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment