что мне не хватает в моей функции dateFormatter? - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь создать функцию для быстрого преобразования строки в дату из API.Я видел много примеров по этому поводу и пытался сделать то же самое, но он всегда возвращает ноль.

let dateStr = "1996-11-24T09:02:32Z"

func toDate(str: String) -> Date? {
    let dateForm = DateFormatter()
    dateForm.dateFormat = "dd-MM-yyyy"
    dateForm.locale = Locale(identifier: "en_US")
    let date = dateForm.date(from: str)
    return date
}


print(toDate(str: dateStr)) // always prints nil

Я пытался настроить, изменить местоположение, удалить местоположение, изменить дату, но ничего не работает.

что тут может быть не так?

заранее спасибо

1 Ответ

0 голосов
/ 14 марта 2019

Поскольку ваша дата 1996-11-24T09:02:32Z и вы используете формат dd-MM-yyyy, который не совпадает. поэтому вам нужно заменить dd-MM-yyyy на yyyy-MM-dd'T'HH:mm:ssZ, и он будет работать нормально.

И ваш результат будет:

let dateStr = "1996-11-24T09:02:32Z"

func toDate(str: String) -> Date? {
    let dateForm = DateFormatter()
    dateForm.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    dateForm.locale = Locale(identifier: "en_US_POSIX")
    let date = dateForm.date(from: str)
    return date
}


print(toDate(str: dateStr)) // "Optional(1996-11-24 09:02:32 +0000)\n"

Или вы можете использовать короткий путь, как предложил Дан:

func toDate(str: String) -> Date? {
    return ISO8601DateFormatter().date(from: str)
}

print(toDate(str: dateStr)) // "Optional(1996-11-24 09:02:32 +0000)\n"

Или, если вы предпочитаете Extension

extension Formatter {
    static let iso8601 = ISO8601DateFormatter()
}

let dateStr = "1996-11-24T09:02:32Z"
Formatter.iso8601.date(from: dateStr) // "Nov 24, 1996 at 2:32 PM"
...