iOS Swift 3:将“yyyy-MM-dd'T'HH:mm:ssZ”格式的string转换为date对象
你好,我有一本字典
self.publishedAt = dictionary["publishedAt"] as? NSString
其中我收到date“ 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)")
但是没有。 🙁
什么是以简单格式获取date的正确方法?
您需要input格式将ISO8601string转换为date和输出格式以将date转换回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)")
将string转换为Date
对象:
let string = "2017-01-27T18:36:36Z" let isoFormatter = ISO8601DateFormatter() let date = isoFormatter.date(from: string)!
或者,如果您需要支持早于ISO8601DateFormatter
iOS版本:
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)!
(要理解为什么我们要为ISO 8601date格式化程序设置locale
,请参阅Apple技术问答1480。 )
然后,要将其转换为用户友好的date格式,您需要使用单独的格式化程序(或使用上面的第二个示例,您可以重新使用格式化程序,但请记住将locale
重置为Locale.current
):
let formatter = DateFormatter() formatter.dateStyle = .short formatter.timeStyle = .medium let result = formatter.string(from:date)
请注意,我build议使用这些样式参数向用户提供date而不是dateFormat
string,所以它使用适合其语言环境的样式,而不是假设他们想要24小时或不使用和/或是否使用dd-MM-yyyy
与MM-dd-yyyy
格式。
请注意,更改date格式化程序的格式(例如更改dateFormat
string)是一个相对昂贵的过程,所以如果要为多个date执行此过程,请不要使用单个DateFormatter
并不断地更改其dateFormat
或样式来回(或者更糟的是,为每个date实例化新的格式化程序)。 相反,应该为每个date格式样式创build一个格式化程序,并尽可能重新使用它的语法。