Swift如何一次性按日期和时间对数组进行排序?
Swift实现按日期+时间降序排序数组
没问题,这个需求用Swift的内置排序方法就能轻松搞定,而且因为你的日期和时间格式都是字典序与实际时间顺序完全匹配的(比如2019-11-18字符串比2019-11-16大,22:00比19:00大),甚至不需要把字符串转成Date类型,直接比较字符串就够了,非常高效。
步骤1:定义数据模型
先把你的数组元素定义成一个结构体(也可以用类,看实际需求):
struct ScheduleItem { let date: String // 格式固定为 yyyy-MM-dd let time: String // 格式固定为 HH:mm }
步骤2:准备原始数组
按照你给出的示例创建原始数据:
let originalItems: [ScheduleItem] = [ ScheduleItem(date: "2019-11-18", time: "19:00"), ScheduleItem(date: "2019-11-18", time: "22:00"), ScheduleItem(date: "2019-10-14", time: "16:00"), ScheduleItem(date: "2019-11-16", time: "13:00"), ScheduleItem(date: "2019-11-16", time: "14:00") ]
步骤3:执行排序逻辑
使用sort(by:)方法,先按日期降序排序,当日期相同时再按时间降序排序:
let sortedItems = originalItems.sorted { itemA, itemB in // 先比较日期:如果日期不同,直接按字符串降序 if itemA.date != itemB.date { return itemA.date > itemB.date } // 日期相同的情况下,再按时间字符串降序 return itemA.time > itemB.time }
验证排序结果
你可以打印结果确认是否符合预期:
// 遍历打印排序后的结果 sortedItems.forEach { item in print("date: \(item.date), time: \(item.time)") }
输出结果会是:
date: 2019-11-18, time: 22:00 date: 2019-11-18, time: 19:00 date: 2019-11-16, time: 14:00 date: 2019-11-16, time: 13:00 date: 2019-10-14, time: 16:00
(注:你给出的期望结果里有几处日期笔误,比如把2019-10-14写成了2019-11-14,上面的代码会按照正确的时间逻辑输出哦)
额外说明
如果以后你的日期/时间格式发生变化(比如变成MM/dd/yyyy这种字典序和时间顺序不匹配的格式),那建议把date和time拼接成完整的时间字符串,再转成Date类型进行比较,示例代码如下:
let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" let sortedItemsWithDate = originalItems.sorted { itemA, itemB in let dateA = dateFormatter.date(from: "\(itemA.date) \(itemA.time)")! let dateB = dateFormatter.date(from: "\(itemB.date) \(itemB.time)")! return dateA > dateB }
不过针对你当前的格式,直接比较字符串是最简单高效的方案。
内容的提问来源于stack exchange,提问作者Drey
相关产品推荐
相关产品推荐

