Как отсортировать компоненты даты в Swift? - PullRequest
0 голосов
/ 18 июня 2019

Я хочу сгруппировать данные по датам, которые имеют начальный формат yyyy-MM-dd'T'HH:mm:ss.SSSZ и отображаются как E, dd MMM.Мне удалось сгруппировать их по датам, но не удалось отсортировать даты в порядке убывания.Как отсортировать компоненты даты после группировки в Словаре?

Ответ JSON

{
    "list": [
        {
            "userId": "test1",
            "transactionTime": "2019-06-20T14:01:00.253+08:00"
        },
        {
            "userId": "test2",
            "transactionTime": "2019-06-16T14:02:00.253+08:00"
        },
        {
            "userId": "test3",
            "transactionTime": "2019-06-12T14:01:00.253+08:00"
        },
        {
            "userId": "tes4",
            "transactionTime": "2019-06-17T14:02:00.253+08:00"
        },
    ]
}

Группировка

func convertToDateObj() -> Date {
        let dateFormatter = DateFormatter()

        // Convert from initial date string to date object
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        let dateObj = dateFormatter.date(from: self)!
        return dateObj
    }


// Group list by date
let groupedList = Dictionary(grouping: rawTransactionsList, by: { list -> DateComponents in
    let dateObj = list.transactionTime.convertToDateObj()
    let date = Calendar.current.dateComponents([.day, .month], from: (dateObj))
    return date
})

// QUESTION
// How do I sort the keys?
// groupList.keys.sorted(...)?

// Populate my list with grouped list
groupedList.keys.forEach { key in
    print("Group keys \(key)")
    let values = groupedList[key]
    groupedtransactionsList.append(values ?? [])
}

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Вероятно, вам также следует сгруппировать по годам, иначе один и тот же день в разные годы будет в одной группе:

let date = Calendar.current.dateComponents([.day, .month, .year], from: (dateObj))

Один из способов сортировки ключей - преобразовать компоненты даты обратно в Date с, используя Calendar.current.date(from:):

let sortedList = groupedList.sorted {
    Calendar.current.date(from: $0.key) ?? Date.distantFuture <
        Calendar.current.date(from: $1.key) ?? Date.distantFuture
}

sortedList.forEach { key, values in
    print("Group keys \(key)")
    groupedtransactionsList.append(values ?? [])
}
0 голосов
/ 18 июня 2019

Я предлагаю использовать строку даты в формате yyyy-MM-dd в качестве ключа словаря, а не компоненты даты.Эта строка может быть отсортирована.

let groupedList = Dictionary(grouping: rawTransactionsList, by: { list -> String in
    let dateObj = list.transactionTime.convertToDateObj()
    let comps = Calendar.current.dateComponents([.day, .month, .year], from: dateObj)
    return String(format: "%ld-%.2ld-%.2ld", comps.year!, comps.month!, comps.day!)
})

groupedtransactionsList = groupedList.keys.sorted(by: >).map { groupedList[$0]! }
...