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

Ios 按日期字符串对字典数组排序,ios,swift,date,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(按:{$0.latestMessage.date>$1.latestMessage.date}) 也有类似的问题,但没有一个回答我的问题,因为我的特定日期字符串格式 在月份变化之前,它运行良好,这是另一个问题。如果日期在同

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

我想把这些从新短到旧,我如何做到这一点

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

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


在月份变化之前,它运行良好,这是另一个问题。如果日期在同一个月,为什么工作?我猜它根本不应该起作用。

它对同一个月的日期起作用的原因是它在字符串中的日期之后。我建议将日期属性类型从String更改为date。如果无法更改属性类型,则需要创建自定义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
    }()
}


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

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

[对话(最新消息:消息(日期: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)

它适用于同一个月的日期的原因是它在字符串中的日期之后。我建议将日期属性类型从String更改为date。如果无法更改属性类型,则需要创建自定义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
    }()
}


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

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

[对话(最新消息:消息(日期: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)

您需要使用DateFormatter并将字符串转换为日期对象,在stackoverflow上查找相关信息应该不是很难,您需要使用DateFormatter并将字符串转换为日期对象,在stackoverflow上查找相关信息应该不是很难,对我来说很好,还有一个小问题。firebase实时数据库是存储日期还是仅存储int bool和string?如果是这种情况,如何在数据库中存储日期?您建议我将属性更改为date,但如果我从db存储并调用日期,它会发生什么变化?谢谢,如何使用此排序功能?每次我都要对数组进行排序,还是只要一次就足够了?它是如何工作的。Thx很多。不,您不能在firebase中存储日期,但您可以将日期的格式更改为
“yyyy-MM-dd'HH:MM:ss.sssxxx”
,从而简化排序。元素的顺序可以让你简单地对字符串进行排序,我不知道你是如何构造数据的。不能依靠字典来维持Swift中元素的顺序。因此,如果您不想在显示之前对元素进行排序,则需要使用数组来保持元素的顺序。firebase实时数据库是存储日期还是仅存储int bool和string?如果是这种情况,如何在数据库中存储日期?您建议我将属性更改为date,但如果我从db存储并调用日期,它会发生什么变化?谢谢,如何使用此排序功能?每次我都要对数组进行排序,还是只要一次就足够了?它是如何工作的。Thx很多。不,您不能在firebase中存储日期,但您可以将日期的格式更改为
“yyyy-MM-dd'HH:MM:ss.sssxxx”
,从而简化排序。元素的顺序可以让你简单地对字符串进行排序,我不知道你是如何构造数据的。不能依靠字典来维持Swift中元素的顺序。因此,如果不想在显示之前对元素进行排序,则需要使用数组来保持元素的顺序。