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而不是dateFormatstring,所以它使用适合其语言环境的样式,而不是假设他们想要24小时或不使用和/或是否使用dd-MM-yyyyMM-dd-yyyy格式。


请注意,更改date格式化程序的格式(例如更改dateFormatstring)是一个相对昂贵的过程,所以如果要为多个date执行此过程,请不要使用单个DateFormatter并不断地更改其dateFormat或样式来回(或者更糟的是,为每个date实例化新的格式化程序)。 相反,应该为每个date格式样式创build一个格式化程序,并尽可能重新使用它的语法。