ISO8601DateFormatter не преобразовывает строку в дату - PullRequest
0 голосов
/ 10 марта 2020

У меня есть строка даты и времени 2020-03-09T11: 53: 39.474Z . Мне нужно преобразовать его в Date

let dateString = "2020-03-09T11:53:39.474Z"
if let date = ISO8601DateFormatter().date(from: dateString) {
    print(dateFormatter.string(from: date))
} else {
    print("Could not convert date")
}

Но он не может правильно его преобразовать.

Есть идеи, почему это происходит?

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

назначенный инициализатор init() из ISO8601DateFormatter делает это:

По умолчанию инициализатор форматирования использует часовой пояс GMT, RF C Стандартный формат 3339 («гггг-мм-дд'тчч: мм: ссZZZZZ») и следующие параметры: withInternetDateTime, withDashSeparatorInDate, withColonSeparatorInTime и withTimeZone.

Очевидно, что ваша дата не в формате yyyy-MM-dd'T'HH:mm:ssZZZZZ, потому что она имеет компонент в миллисекундах.

Вам просто нужно добавить параметр withFractionalSeconds:

let dateString = "2020-03-09T11:53:39.474Z"
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [
    .withInternetDateTime, 
    .withFractionalSeconds, 
    .withColonSeparatorInTime, 
    .withDashSeparatorInDate, 
    .withTimeZone]
if let date = formatter.date(from: dateString) {
    print(date)
} else {
    print("Could not convert date")
}

Я лично хотелось бы перечислить все варианты, чтобы сделать код более понятным, но вы также можете сделать:

formatter.formatOptions.insert(.withFractionalSeconds)
0 голосов
/ 10 марта 2020

Не удается преобразовать, потому что "2020-03-09T11:53:39.474Z" не соответствует ISO8601. dateString должно быть "2020-03-09T11:53:39+474", и оно будет конвертироваться правильно.

...