Сортировка массива даты от самого нового до самого старого в Swift 4 - PullRequest
0 голосов
/ 11 декабря 2018

Мне интересно, как сортировать даты в виде Strings в array.Скорее всего, я бы оставил их в тех же array и sort их правильном пути.Многие попытки, которые я видел, связаны с двумя.Кроме того, они не были подходящим форматом времени, поэтому я хочу знать, как отсортировать его в формате "dd.MM.yyyy".Скорее всего, только с двумя последними числами года.Это возможно?

Вот что я сделал.Я хочу взять дату в структуре для сортировки:

import UIKit

struct Post {
var title: String
var date: String
var user: String
}

var uploadTimes = [Post(title: "Hello", date: "02.10.2018", user: "Roman"),
                Post(title: "Hi", date: "01.10.2018", user: "Roman"),
                Post(title: "", date: "05.09.2018", user: "")]


uploadTimes = uploadTimes.map{ $0.components(separatedBy: ".").reversed().joined(separator: ".")}
print(uploadTimes)
//["2002.02.02", "2002.02.03", "2002.02.05", "2002.02.04"]


let isoFormatter = ISO8601DateFormatter()
isoFormatter.formatOptions = [.withFullDate,]


let dates = uploadTimes.compactMap { isoFormatter.date(from: $0) }
print(dates)
let sortedDates = dates.sorted { $0 > $1 }
print(sortedDates)

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Если вы настаиваете на использовании ISODateFormatter, вам, возможно, придется изменить формат ввода, так как они принимают формат "yyyy.MM.dd".

 import UIKit

 var uploadTimes = ["02.02.2002","03.02.2002","05.02.2002","04.02.2002"]
 uploadTimes = uploadTimes.map{ $0.components(separatedBy: ".").reversed().joined(separator: ".")}
 print(uploadTimes)
  //["2002.02.02", "2002.02.03", "2002.02.05", "2002.02.04"]


 let isoFormatter = ISO8601DateFormatter()
 isoFormatter.formatOptions = [.withFullDate,]


 let dates = uploadTimes.compactMap { isoFormatter.date(from: $0) }
 print(dates)
 let sortedDates = dates.sorted { $0 > $1 }
 print(sortedDates)
0 голосов
/ 12 декабря 2018

Это еще один ответ с обновленной структурой POST.

struct Post {
var title: String
var date: String
var user: String
}

extension Post{
static  let isoFormatter : ISO8601DateFormatter = {
    let formatter =  ISO8601DateFormatter()
        formatter.formatOptions = [.withFullDate,]
    return formatter
   }()

var dateFromString : Date  {
    let  iSO8601DateString = date.components(separatedBy: ".").reversed().joined(separator: ".")
    return  Post.isoFormatter.date(from: iSO8601DateString)!
}
}

var uploadTimes = [Post(title: "", date: "05.09.2018", user: ""),
               Post(title: "Hello", date: "02.10.2018", user: "Roman"),
               Post(title: "Hi", date: "01.10.2018", user: "Roman"),
               ]

//sort dates
let dates = uploadTimes.compactMap { $0.dateFromString }
print(dates)
let sortedDates = dates.sorted { $0 > $1 }
print(sortedDates)

//sort posts
let sortedPost = uploadTimes.sorted{ $0.dateFromString > $1.dateFromString  }
print(sortedPost)

Если используется формат чч: мм дд.Мм.гггг.Обновленный ответ выглядит так:

extension Post{
static  let isoFormatter : ISO8601DateFormatter = {
    let formatter =  ISO8601DateFormatter()
        formatter.formatOptions = [.withInternetDateTime]
    return formatter
   }()

   var dateFromString : Date  {

  let components = date.components(separatedBy: " ")
  let  iSO8601DateString =
        (components.last!).components(separatedBy: ".").reversed().joined(separator: ".") + "T" + (components.first!) + ":00+00:00"
    return  Post.isoFormatter.date(from: iSO8601DateString)!
   }
}

 var uploadTimes = [Post(title: "", date: "01:20 05.09.2018", user: ""),
               Post(title: "Hello", date: "01:21 02.10.2018", user: "Roman"),
               Post(title: "Hi", date: "01:22 02.10.2018", user: "Roman"),
               ]
0 голосов
/ 11 декабря 2018

Нельзя указать формат даты для ISO8601DateFormatter, он принимает даты только в обычном формате ISO.

Если вы замените его обычным DateFormatter (), вы можете указать формат даты.Смотрите ниже код:

var uploadTimes = ["02.02.2002","03.02.2002","05.02.2002","04.02.2002"]

print(uploadTimes)

let isoFormatter = DateFormatter()
isoFormatter.dateFormat = "dd.MM.yyyy"

let dates = uploadTimes.compactMap { isoFormatter.date(from: $0) }

let sortedDates = dates.sorted { $0 > $1 }

print(sortedDates)

let dateStrings = sortedDates.compactMap { isoFormatter.string(from: $0)}

print(dateStrings)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...