Swift 3.0中如何对含UTC字符串日期字段的对象数组排序
Swift 3.0 按UTC日期字符串排序对象数组解决方案
嘿,我来帮你搞定这个排序问题!核心思路是不能直接用字符串排序(不同格式的日期字符串排序逻辑很容易出错),得先把UTC日期字符串转换成Date类型,再基于Date的时间先后进行排序。下面是具体步骤和代码示例:
1. 配置日期格式化器
首先我们需要一个能正确解析UTC日期字符串的DateFormatter,建议把它做成静态扩展,避免重复创建:
extension DateFormatter { static let utcDateFormatter: DateFormatter = { let formatter = DateFormatter() // 这里的格式必须和你的dateAdded字符串格式完全匹配! // 示例格式是ISO8601(比如"2023-10-05T14:48:00Z"),如果你的格式不同请修改 formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" formatter.timeZone = TimeZone(identifier: "UTC") // 明确指定UTC时区 formatter.locale = Locale(identifier: "en_US_POSIX") // 避免系统语言影响解析 return formatter }() }
⚠️ 重要提醒:dateFormat的格式必须和你的dateAdded字段的实际字符串格式完全一致,比如如果你的日期是"2023-10-05"这种简单格式,就把dateFormat改成"yyyy-MM-dd"。
2. 对数组进行排序
我们可以用sort(by:)进行原地排序(直接修改原数组),或者用sorted(by:)返回一个新的排序后的数组。
原地排序(修改原数组)
itemArray.sort { itemA, itemB in // 先把两个item的dateAdded转成Date类型 guard let dateA = DateFormatter.utcDateFormatter.date(from: itemA.dateAdded), let dateB = DateFormatter.utcDateFormatter.date(from: itemB.dateAdded) else { // 处理日期解析失败的情况:这里默认把解析失败的元素放在后面,你可以根据需求调整 return false } // 升序排序(旧日期在前,新日期在后),如果要降序就改成`dateA > dateB` return dateA < dateB }
返回新数组(不修改原数组)
let sortedItemArray = itemArray.sorted { itemA, itemB in guard let dateA = DateFormatter.utcDateFormatter.date(from: itemA.dateAdded), let dateB = DateFormatter.utcDateFormatter.date(from: itemB.dateAdded) else { return false } // 降序排序(新日期在前,旧日期在后) return dateA > dateB }
完整示例
我们来写一个完整的测试代码,看看效果:
class Item { var name: String var type: String var dateAdded: String // UTC日期字符串 init(name:String, type: String, dateAdded: String) { self.name = name self.type = type self.dateAdded = dateAdded } } // 初始化数组 var itemArray: [Item] = [] let item1 = Item(name: "Name1", type: "Person", dateAdded: "2023-10-05T14:48:00Z") let item2 = Item(name: "Name2", type: "Animal", dateAdded: "2023-10-03T09:12:00Z") let item3 = Item(name: "Name3", type: "Plant", dateAdded: "2023-10-06T18:30:00Z") itemArray.append(contentsOf: [item1, item2, item3]) // 执行升序排序 itemArray.sort { itemA, itemB in guard let dateA = DateFormatter.utcDateFormatter.date(from: itemA.dateAdded), let dateB = DateFormatter.utcDateFormatter.date(from: itemB.dateAdded) else { return false } return dateA < dateB } // 打印排序结果 for item in itemArray { print("\(item.name) - \(item.dateAdded)") }
运行后输出会是:
Name2 - 2023-10-03T09:12:00Z Name1 - 2023-10-05T14:48:00Z Name3 - 2023-10-06T18:30:00Z
内容的提问来源于stack exchange,提问作者Atarang
相关产品推荐
相关产品推荐

