You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:45:06