iOS Swift 3: преобразовать строку формата "yyyy-MM-dd'T'HH: mm: ssZ" на сегодняшний день

Привет, у меня есть словарь

self.publishedAt = dictionary["publishedAt"] as? NSString 

в котором я получаю дату « 2017-01-27T18: 36: 36Z ». Я хочу преобразовать его в читаемом формате: dd-MM-yyyy hh: mm: ss . я пробовал через

 let dateFormatter = DateFormatter() dateFormatter.dateFormat = "dd-MM-yyyy hh:mm:ss" let date = dateFormatter.date(from: (self.publishedAt as? String)!) print("EXACT_DATE : \(date)") 

Но ноль. 🙁

Каков правильный способ получить дату в простом формате?

2 Solutions collect form web for “iOS Swift 3: преобразовать строку формата "yyyy-MM-dd'T'HH: mm: ssZ" на сегодняшний день”

Вам нужен формат ввода для преобразования строки ISO8601 в дату и выходной формат для преобразования даты в строку:

 let string = "2017-01-27T18:36:36Z" let dateFormatter = DateFormatter() let tempLocale = dateFormatter.locale // save locale temporarily dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" let date = dateFormatter.date(from: string)! dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss" dateFormatter.locale = tempLocale // reset the locale let dateString = dateFormatter.string(from: date) print("EXACT_DATE : \(dateString)") 

Чтобы преобразовать строку в объект Date :

 let string = "2017-01-27T18:36:36Z" let isoFormatter = ISO8601DateFormatter() let date = isoFormatter.date(from: string)! 

Или, если вам нужно поддерживать версии iOS, которые предшествуют ISO8601DateFormatter :

 let isoFormatter = DateFormatter() isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" isoFormatter.locale = Locale(identifier: "en_US_POSIX") let date = isoFormatter.date(from: string)! 

(Чтобы понять, почему мы устанавливаем locale для форматирования даты ISO 8601, см. Технические вопросы и технические характеристики Apple 1480 ).

Затем, чтобы преобразовать это в удобный формат даты, вы должны использовать отдельный форматтер (или использовать второй пример выше, вы можете повторно использовать форматтер, но не забудьте вернуть locale обратно в Locale.current ):

 let formatter = DateFormatter() formatter.dateStyle = .short formatter.timeStyle = .medium let result = formatter.string(from:date) 

Обратите внимание, что я предлагаю использовать эти параметры стиля при представлении даты для пользователя, а не в строке dateFormat , поэтому он использует стили, соответствующие их языку, вместо того, чтобы предполагать, что они хотят 24 часа или нет, и / или используют ли они dd-MM-yyyy против формата MM-dd-yyyy .


Обратите внимание, что изменение форматов форматирования даты (например, изменение строки dateFormat ) является относительно дорогостоящим процессом, поэтому, если вы выполняете этот процесс для нескольких дат, не принимайте ни одного параметра DateFormatter и постоянно меняйте свой dateFormat или стилей назад и вперед (или, что еще хуже, создавать новые форматы для каждой даты). Вместо этого создайте один форматтера для стиля формата даты и максимально используйте его грамматику.

  • Ссылка на раскадровку для раскадровки cocoapods кажется сломанной
  • Как определить непрограммное отключение от MCSession текущего устройства?
  • Как отобразить ход загрузки для UIWebView и фактического UIWebView на отдельные виды?
  • Swift UITableView делегат и dataSource объявление и сохранение циклов
  • Проблемы с производительностью SwiftyJSON
  • Как правильно наблюдать два соединенных узла с помощью Firebase с помощью Swift
  • Пейзажная ориентация для коллекции в Swift
  • Введите «String!» не соответствует протоколу «Equatable»
  • Рассматривать общий экземпляр TypeA как общий экземпляр SuperclassOfTypeA
  • Вставить subview за TabBar из дочернего представления TabBarController
  • Есть ли способ добавить UIPickerView в UIAlertController (Alert или ActionSheet) в Swift?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.