Ответ на ваш вопрос: не вводите дефис / тире символ или символ с клавиатуры.Просто скопируйте его из окна консоли (операторы печати ответа веб-службы и вставьте его в формате даты)
Попробуйте и посмотрите:
let dateString = "2017–04–02T13:10:00.000" //Date coming from server
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy–MM–dd'T'HH:mm:ss.SSS"
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
let date = dateFormatter.date(from: dateString)
print("date is :\(String(describing: date))")
Результат: дата: Необязательно (2017-04-02 07:40:00 +0000)
Также обратите внимание, что у вас проблема с часовым поясом.Ваша исходная строка даты не предоставляет никакого конкретного часового пояса.Поэтому вам нужно решить, какой часовой пояс представляет строка.Так как это приходит с сервера, это, скорее всего, в UTC времени.Если это так, вам нужно установить свойство timeZone
средства форматирования даты.В противном случае строка будет проанализирована, как если бы это было локальное время пользователя.
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
Кредит: Martin R
Строка сервера содержит "EN-DASH" (U+2013) в качестве разделителей, а не обычных дефисов (минус).
(в соответствии с предложением Leo Dabus ), установите идентификатор языкового стандарта для вашего устройства форматирования даты - "en_US_POSIX".