iOS Swift 3 : Convert “yyyy-MM-dd'T'HH:mm:ssZ” format string to date object

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

Hello i have a dictionary

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

in which i'm getting date "2017-01-27T18:36:36Z". I want to convert it in readable format : dd-MM-yyyy hh:mm:ss. i tried via

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

But getting nil. :(

What is the correct way to get date in simple format?

回答1:

You need an input format to convert the ISO8601 string to date and an output format to convert the date back to string:

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)") 


回答2:

To convert string to Date object:

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

Or, if you need to support iOS versions that predate 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)! 

(To understand why we set the locale for the ISO 8601 date formatter, see Apple Technical Q&A 1480.)

Then, to convert that to a user-friendly date format, you'd use a separate formatter (or use the second example, above, you can re-use the formatter, but remember to reset the locale back to Locale.current):

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

Note, I'd suggest using those style parameters when presenting the date back to the user rather than the dateFormat string, so it's using the styles appropriate for their locale, rather than assuming they want 24h clock or not and/or whether they use dd-MM-yyyy vs MM-dd-yyyy format.


Note, changing the formats of date formatter (e.g. changing the dateFormat string) is a relatively expensive process, so if you're performing this process for multiple dates, do not take a single DateFormatter and constantly change its dateFormat or styles repeatedly back and forth (or worse, instantiate new formatters for each date). Instead, create one formatter per date format style and re-use it grammar as much as possible.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!