按日期字符串对字典数组进行排序

时间:2020-10-31 22:07:21

标签: ios swift date

我有一个包含日期属性作为字符串的文档数组,例如“ 29-10-2020-20:58”,“ 30-10-2020-20:43”,“ 01-11-2020-00:19” ““ 01-11-2020-00:31”

我想将它们从新到旧都做短,该如何实现?

我尝试过
conversations.sort(by: {$0.latestMessage.date > $1.latestMessage.date})

也有类似的问题,但由于我特定的日期字符串格式,没有一个回答我的问题

它可以正常工作,直到月份改变为止,这是另一个问题。如果日期在同一个月,为什么还能工作?我猜想它根本不起作用。

1 个答案:

答案 0 :(得分:0)

它适用于同一月中的日期的原因是它在字符串中的第二天之后。我建议将日期属性类型从字符串更改为日期。如果您无法更改属性类型,则需要创建一个自定义DateFormatter来解析您的日期字符串并对结果日期进行排序:

extension Formatter {
    static let date: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = .init(identifier: "en_US_POSIX")
        formatter.dateFormat = "dd-MM-yyyy-HH:mm"
        return formatter
    }()
}

extension String {
    var customDate: Date? { Formatter.date.date(from: self) }
}

这假定您的日期字符串始终是有效日期:

conversations.sort(by: { $0.latestMessage.date.customDate! > $1.latestMessage.date.customDate!})
print(conversations)

这将打印:

[Conversation(latestMessage:Message(date:“ 01-11-2020-00:31”)),
会话(最新消息:消息(日期:“ 01-11-2020-00:19”))),
会话(最新消息:消息(日期:“ 30-10-2020-20:43”))),
会话(最新消息:消息(日期:“ 29-10-2020-20:58”)))


如果不能保证字符串始终是有效日期,则可以使用nil合并运算符提供默认值:

conversations.sort(by: { $0.latestMessage.date.customDate ?? .distantFuture > $1.latestMessage.date.customDate  ?? .distantFuture })
print(conversations)