Search code examples
iosswiftswift4nsdateformatter

How to sort an array dates in swift 4


I have an array of dates like this :-

  var dateArray = ["2016-04-20", "2016-04-22", "2016-04-25", "2016-04-30"]

and I want to find out the difference of days between them. I do some research and i am able to do that with only two dates here is the approach i did in finding the difference between two date

let dateFormatter = DateFormatter()
let isoDate = "2016-04-20"
let calendar = NSCalendar.current
let currentDate = Date()

And in my viewDidLoad method I did this

    override func viewDidLoad() {
    super.viewDidLoad()



//  let components = calendar.dateComponents([.day], from: )
    dateFormatter.dateFormat = "yyyy-MM-dd"
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") //en_US_POSIX
    let formatedStartDate = dateFormatter.date(from: isoDate)
    let date = dateArray.compactMap { dateFormatter.date(from: $0) } // for date array
    print(date)
    let components = Set<Calendar.Component>([.day])
    let differenceOfDate = Calendar.current.dateComponents(components, from: formatedStartDate!, to: currentDate )

    print (differenceOfDate)
    apiData()
}

As you can see in the code i created a constant let isoDate = "2016-04-20" and changed into formatedStartDate and find the difference between form this date to current date then it worked. But what if I have my own array of dates and how can i find the difference of my own array of dates and sort it into increasing or decreasing order. Please help?


Solution

    • Create the date formatter

      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "yyyy-MM-dd"
      dateFormatter.locale = Locale(identifier: "en_US_POSIX") //en_US_POSIX
      
    • Map the date string array to Date instances

      let dateStringArray = ["2016-04-20", "2016-04-22", "2016-04-25", "2016-04-30"]
      let dateArray = dateStringArray.map {dateFormatter.date(from: $0)!} // add .sorted() if the array is unordered.
      
    • In a loop get the differences between adjacent items

      var differences = [Int]()
      for i in 0..<dateArray.count - 1 {
          let dayComponent = Calendar.current.dateComponents([.day], from: dateArray[i], to: dateArray[i+1])
          differences.append(dayComponent.day!)
      }
      print(differences)