2017-01-28 34 views
13

你好,我有一本字典iOS的斯威夫特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)") 

但是得到零。 :(

什么是获取日期在简单的格式正确的方式

+0

您需要**输入**格式将ISO8601字符串转换为日期和**输出**格式以将日期转换回字符串,另请参阅http://stackoverflow.com/questions/33277970/how -to-convert-string-to-date-to-string-in-swift-ios?rq = 1,不要在Swift中使用'NSString'。 – vadian

回答

30

您需要输入格式为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)") 
+0

@vadian:非常感谢 –

+0

@vadian为什么重置语言环境? – user1960169

+0

@ user1960169正如罗布的回答中所提到的,请阅读[Apple技术问答1480](https://developer.apple.com/library/content/qa/qa1480/_index.html) – vadian

13

要字符串转换为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)! 

(要理解为什么我们设置locale为ISO 8601日期格式,见Apple Technical Q&A 1480

然后,将其转换成一个用户友好的日期格式,你会使用一个单独的格式化(或使用第二个例子,上面,你可以重新使用的格式,但记得要重置localeLocale.current):

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

注意,我建议呈现追溯到在使用这些样式参数给用户而不是dateFormat字符串,因此它使用适合其区域设置的样式,而不是假设他们想要24小时或不使用和/或使用dd-MM-yyyyMM-dd-yyyy格式。


注意,改变日期格式的格式(例如,更换dateFormat字符串)是一个相对昂贵的过程,因此,如果您要执行此过程多个日期,不要采取单一DateFormatter,并不断地改变其dateFormat或风格反复来回(或更糟糕的是,为每个日期实例化新的格式化程序)。相反,应根据日期格式样式创建一个格式化程序,并尽可能重新使用它的语法。

+0

非常感谢:) 最后一件事:如何我可以设置为我的时区吗? –

+1

默认情况下,这第二个格式化程序将在您的时区中生成用户友好的字符串。您可以设置格式化程序的'timezone',但只有在您创建的字符串不是您现有的时区时才需要这样做。 – Rob

+0

thanx thanx很多:) –