let raw = "January 31, 2020 at 11:59:59 p.m. (ET)"
func getDateFrom(_ raw: String) -> Date? {
if let i = (raw.range(of: "(")?.lowerBound) { // get index of open parenthesis
var zone: TimeZone?
let dateString = String(raw.prefix(upTo: i)) // January 31, 2020 at 11:59:59 p.m.
let zoneString = String(raw.suffix(from: i)) // (ET)
switch zoneString { // determine time zone
case "(ET)", "(EST)", "(EDT)": // study your data source and learn how they may express time zones
zone = TimeZone(abbreviation: "EDT")
default:
return nil // failure
}
let formatter = DateFormatter()
formatter.dateFormat = "MMMM d, yyyy 'at' hh:mm:ss a"
formatter.timeZone = zone
formatter.amSymbol = "a.m."
formatter.pmSymbol = "p.m."
if let date = formatter.date(from: dateString) {
return date
} else {
return nil
}
} else {
return nil
}
}
if let date = getDateFrom(raw) {
print(date) // 2020-02-01 04:59:59 +0000
}
Это должно быть хорошей отправной точкой. Есть несколько способов сделать это, например, хотите ли вы, чтобы он потерпел неудачу, если часовой пояс не может быть определен, как извлечь часовой пояс (используя сокращения, идентификаторы, секунды из GMT) и т. Д. c. Мне нравится ответ Вадиана, если я полностью чувствую себя комфортно с часовым поясом. Но часовые пояса настолько непоследовательны и удивительно не стандартизированы, когда выражаются в виде строк, что я бы предпочел выделить механизм для его получения и проверки его правильности.
Тем не менее, это довольно грубый пример того, где Я бы начал - готовая версия была бы более нюансированной. В этом примере, если происходит сбой часового пояса, происходит сбой функции.