Преобразовать строку даты в объект даты - PullRequest
2 голосов
/ 05 февраля 2020

Фактическая строка - January 31, 2020 at 11:59:59 p.m. (ET). формат - "MMMM d, yyyy 'at' hh:mm:ss aa" Невозможно преобразовать эту строку в объект Date. Пробовал различный формат даты, но не смог изменить строку на объект Date. Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Вы можете удалить нестандартный символ . между p и m и убрать скобки вокруг часового пояса

let dateString = "January 31, 2020 at 11:59:59 p.m. (ET)"
let trimmedDateString = dateString.replacingOccurrences(of: ".m.", with: "m")
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "MMMM d, yyyy 'at' hh:mm:ss a (v)"
let date = formatter.date(from: trimmedDateString)
0 голосов
/ 05 февраля 2020
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. Мне нравится ответ Вадиана, если я полностью чувствую себя комфортно с часовым поясом. Но часовые пояса настолько непоследовательны и удивительно не стандартизированы, когда выражаются в виде строк, что я бы предпочел выделить механизм для его получения и проверки его правильности.

Тем не менее, это довольно грубый пример того, где Я бы начал - готовая версия была бы более нюансированной. В этом примере, если происходит сбой часового пояса, происходит сбой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...