Ace*_*Ace 1 json foundation date-parsing swift decodable
我正在尝试将 JSON 文档中的日期格式化为“mm-dd-yyyy”格式。我有以下数据:
{"data":[{
"id": 123,
"url": "https://www.google.com",
"title": "The Google link",
"created_at": "2017-08-29T04:00:00.000Z",//date to format
"sent": true,
"alternative": "https://google.com",
"things": [],
"description": [
"search",
"lookup"
],
"company": "Alphabet"
}]}
Run Code Online (Sandbox Code Playgroud)
这是我的结构:
struct Sitedata: Decodable{
let data: [site]
}
struct site: Decodable {
let id: Int
let url: String
let title: String
let created_at: String
let sent: Bool
let alternative: String
let things: [String]
let description: [String]
let company: String
}
let sites = try JSONDecoder().decode(Sitedata.self, from: data)
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,但它产生了nil:
func date(dateString: String){
// var dateString = "14.01.2017T14:54:00"
let format = "dd.MM.yyyy'T'HH:mm:ss"
let date = Date()
print("original String with date: \(dateString)")
print("date String() to Date(): \(dateString.toDate(format: format)!)")
print("date String() to formated date String(): \(dateString.toDateString(inputFormat: format, outputFormat: "dd MMMM")!)")
print("format Date(): \(date.toString(format: "dd MMM HH:mm")!)")
}
extension DateFormatter {
convenience init (format: String) {
self.init()
dateFormat = format
locale = Locale.current
}
}
extension String {
func toDate (format: String) -> Date? {
return DateFormatter(format: format).date(from: self)
}
func toDateString (inputFormat: String, outputFormat:String) -> String? {
if let date = toDate(format: inputFormat) {
return DateFormatter(format: outputFormat).string(from: date)
}
return nil
}
}
extension Date {
func toString (format:String) -> String? {
return DateFormatter(format: format).string(from: self)
}
}
How would I be able to parse and then format this date to MM-dd-yyyy?
Run Code Online (Sandbox Code Playgroud)
首先,遵循 Swift 命名约定:UpperCamelCase类名和lowerCamelCase变量名。其次,帮自己一个忙,创造created_at一个Date领域,就像它显然是的那样。这会让你以后免去很多头痛。
这是代码:
struct SiteData: Decodable{
let data: [Site]
}
struct Site: Decodable {
let id: Int
let url: String
let title: String
let created_at: Date // changed to Date
let sent: Bool
let alternative: String
let things: [String]
let description: [String]
let company: String
}
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)
let sites = try decoder.decode(SiteData.self, from: json)
Run Code Online (Sandbox Code Playgroud)
现在它created_at已从 JSON 解析为正确的Date,您可以按照自己喜欢的方式格式化它:
let formatter2 = DateFormatter()
formatter2.dateFormat = "MM-dd-yyyy"
print(formatter2.string(from: sites.data[0].created_at))
Run Code Online (Sandbox Code Playgroud)
请注意,DateFormatter创建它的成本相当昂贵,更改其dateFormat属性更是如此。如果您必须将大量日期格式化为字符串(反之亦然),则只需创建一次日期格式化程序并继续重复使用它们。
| 归档时间: |
|
| 查看次数: |
820 次 |
| 最近记录: |