Привет!
Необходимо обработать большой массив дат, и соответственно важна скорость. Как выяснилось,
let date = dateFormatter.date(from: dateString)
работает очень медленно. В гугле нашел аналоги на С: strptime()
и vsscanf()
(здесь подробнее http://jordansmith.io/performant-date-parsing/). Автору больше нравится вторая, но первая у меня оказалась в полтора раза быстрее. В другом месте (https://gist.github.com/robnadin/f3cfd06095b085f5e132) нашел немного более лучшую реализацию и актуализировал код:
extension Date {
static func dateFromISO8601String(_ string: String) -> Date? {
var tm = Darwin.tm()
strptime(string.cString(using: .utf8)!, "%Y%m%d %H%M%S", &tm)
tm.tm_isdst = -1
return Date(timeIntervalSince1970: TimeInterval(mktime(&tm) + TimeZone.current.secondsFromGMT()))
}
}
Проблема в том, что сравнивая результаты парсинга (dateFormatter vs strptime), даты отличаются на 1 час (где-то с марта по октябрь), что скорее всего связано с day light saving. Как это можно учесть в коде?