iOS Swift 3:将"yyyy-MM-dd'T'HH:mm:ssZ"格式字符串转换为日期对象
iOS Swift 3 : Convert "yyyy-MM-dd'T'HH:mm:ssZ" format string to date object
你好,我有一本字典
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)")
但是没有得到。 :(
获取简单格式日期的正确方法是什么?
您需要一种将 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)!
或者,如果您需要支持早于 ISO8601DateFormatter
的 iOS 版本:
let isoFormatter = DateFormatter()
isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssX"
isoFormatter.locale = Locale(identifier: "en_US_POSIX")
isoFormatter.timeZone = TimeZone(secondsFromGMT: 0)
let date = isoFormatter.date(from: string)!
(要了解为什么我们为 ISO 8601 日期格式化程序设置 locale
,请参阅 Apple Technical Q&A 1480。)
然后,要将其转换为 user-friendly 日期格式,您需要使用单独的格式化程序(或者使用上面的第二个示例,您可以 re-use 格式化程序,但请记住重新设置locale
回到 Locale.current
):
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.timeStyle = .medium
let result = formatter.string(from:date)
注意,我建议在向用户呈现日期时使用这些样式参数而不是 dateFormat
字符串,因此它使用适合其语言环境的样式,而不是假设他们想要 24 小时时钟或不 and/or 他们是否使用 dd-MM-yyyy
与 MM-dd-yyyy
格式。
请注意,更改日期格式化程序的格式(例如更改 dateFormat
字符串)是一个相对昂贵的过程,因此如果您对多个日期执行此过程,请不要使用单个 DateFormatter
并不断地来回改变它的 dateFormat
或样式(或者更糟的是,为每个日期实例化新的格式化程序)。相反,为每个日期格式样式创建一个格式化程序,并且 re-use 尽可能多地使用它的语法。
刚刚在您的代码中使用了函数(swift 4.2)。
public func convertDateFormatter(date: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"//this your string date format
dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
dateFormatter.locale = Locale(identifier: "your_loc_id")
let convertedDate = dateFormatter.date(from: date)
guard dateFormatter.date(from: date) != nil else {
assert(false, "no date from string")
return ""
}
dateFormatter.dateFormat = "HH:mm a"///this is what you want to convert format
dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
let timeStamp = dateFormatter.string(from: convertedDate!)
print(timeStamp)
return timeStamp
}
谢谢
你好,我有一本字典
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)")
但是没有得到。 :(
获取简单格式日期的正确方法是什么?
您需要一种将 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)!
或者,如果您需要支持早于 ISO8601DateFormatter
的 iOS 版本:
let isoFormatter = DateFormatter()
isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssX"
isoFormatter.locale = Locale(identifier: "en_US_POSIX")
isoFormatter.timeZone = TimeZone(secondsFromGMT: 0)
let date = isoFormatter.date(from: string)!
(要了解为什么我们为 ISO 8601 日期格式化程序设置 locale
,请参阅 Apple Technical Q&A 1480。)
然后,要将其转换为 user-friendly 日期格式,您需要使用单独的格式化程序(或者使用上面的第二个示例,您可以 re-use 格式化程序,但请记住重新设置locale
回到 Locale.current
):
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.timeStyle = .medium
let result = formatter.string(from:date)
注意,我建议在向用户呈现日期时使用这些样式参数而不是 dateFormat
字符串,因此它使用适合其语言环境的样式,而不是假设他们想要 24 小时时钟或不 and/or 他们是否使用 dd-MM-yyyy
与 MM-dd-yyyy
格式。
请注意,更改日期格式化程序的格式(例如更改 dateFormat
字符串)是一个相对昂贵的过程,因此如果您对多个日期执行此过程,请不要使用单个 DateFormatter
并不断地来回改变它的 dateFormat
或样式(或者更糟的是,为每个日期实例化新的格式化程序)。相反,为每个日期格式样式创建一个格式化程序,并且 re-use 尽可能多地使用它的语法。
刚刚在您的代码中使用了函数(swift 4.2)。
public func convertDateFormatter(date: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"//this your string date format
dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
dateFormatter.locale = Locale(identifier: "your_loc_id")
let convertedDate = dateFormatter.date(from: date)
guard dateFormatter.date(from: date) != nil else {
assert(false, "no date from string")
return ""
}
dateFormatter.dateFormat = "HH:mm a"///this is what you want to convert format
dateFormatter.timeZone = NSTimeZone(name: "UTC") as TimeZone!
let timeStamp = dateFormatter.string(from: convertedDate!)
print(timeStamp)
return timeStamp
}
谢谢