Create string array of dates from Dates range

痞子三分冷 提交于 2020-01-13 06:40:21

问题


I have Date() properties. startingAt and endingAt. And an array of Date(), which are alreadyRegistred. I have to create an array of strings with dates between startingAt and endingAt. StartingAt and endingAt are included and the last requirement is to exclude alreadyRegistred dates.

Do you have some elegant idea, how to do it? Thanks for help!

Edit: Maximum number of dates in final array will be about 7 days.


回答1:


Dont forget that a Date is basically just a timestamp, and that you can have access to the addingTimeInterval(_:) method.

Knowing that, is very easy to do some calculation between two dates.

I do not have the whole knowledge about your required business logic, but here is a naive implementation that generates Dates between two dates. I'm sure you can run it in a playground and explore a little bit.

import UIKit

func intervalDates(from startingDate:Date, to endDate:Date, with interval:TimeInterval) -> [Date] {
    guard interval > 0 else { return [] }

    var dates:[Date] = []
    var currentDate = startingDate

    while currentDate <= endDate {
        currentDate = currentDate.addingTimeInterval(interval)
        dates.append(currentDate)
    }

    return dates
}


let startingDate = Date() // now
let endDate = Date(timeIntervalSinceNow: 3600 * 24 * 7) // one week from now
let intervalBetweenDates:TimeInterval = 3600 * 3// three hours

let dates:[Date] = intervalDates(from: startingDate, to: endDate, with: intervalBetweenDates)



let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .long

let dateStrings = dates.map{dateFormatter.string(from: $0)}

print("NOW : \(startingDate)")
for (index, string) in dateStrings.enumerated() {
    print("\(index) : \(string)")
}
print("END DATE : \(endDate)")



回答2:


Try this and see:

// Start & End date string
let startingAt = "01/01/2018"
let endingAt = "08/03/2018"

// Sample date formatter
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"

// start and end date object from string dates
var startDate = dateFormatter.date(from: startingAt) ?? Date()
let endDate = dateFormatter.date(from: endingAt) ?? Date()

// String date array, to be excluded
let alreadyRegistred = ["01/01/2018", "15/01/2018", "10/02/2018", "20/02/2018", "05/03/2018"]

// Actual operational logic
var dateRange: [String] = []
while startDate <= endDate {
    let stringDate = dateFormatter.string(from: startDate)

    startDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate) ?? Date()
    if (alreadyRegistred.contains(stringDate)) {
        continue
    } else {
        dateRange.append(stringDate)
    }

}

print("Resulting Array - \(dateRange)")

Here is result:

Resulting Array - ["02/01/2018", "03/01/2018", "04/01/2018", "05/01/2018", "06/01/2018", "07/01/2018", "08/01/2018", "09/01/2018", "10/01/2018", "11/01/2018", "12/01/2018", "13/01/2018", "14/01/2018", "16/01/2018", "17/01/2018", "18/01/2018", "19/01/2018", "20/01/2018", "21/01/2018", "22/01/2018", "23/01/2018", "24/01/2018", "25/01/2018", "26/01/2018", "27/01/2018", "28/01/2018", "29/01/2018", "30/01/2018", "31/01/2018", "01/02/2018", "02/02/2018", "03/02/2018", "04/02/2018", "05/02/2018", "06/02/2018", "07/02/2018", "08/02/2018", "09/02/2018", "11/02/2018", "12/02/2018", "13/02/2018", "14/02/2018", "15/02/2018", "16/02/2018", "17/02/2018", "18/02/2018", "19/02/2018", "21/02/2018", "22/02/2018", "23/02/2018", "24/02/2018", "25/02/2018", "26/02/2018", "27/02/2018", "28/02/2018", "01/03/2018", "02/03/2018", "03/03/2018", "04/03/2018", "06/03/2018", "07/03/2018", "08/03/2018"]




回答3:


let startDate = Date()
let endDate = Date().addingTimeInterval(24*60*60*10) // i did this to get the end date for now
var stringdateArray = [String]()

if let days = getNumberofDays(date1: startDate, date2: endDate) {

    for i in 0...days-1 {
        let date = startDate.addingTimeInterval(Double(i)*24*3600)
        let stringDate =  getStringDate(fromDate: date, havingFormat: "yyyy-MM-dd")
        if !(alreadyRegisteredArray.contains(stringDate)) { // checking if already registered
          stringdateArray.append(stringDate)
       }

    }
}

and our helper method

let dateFormatter = DateFormatter()


func getStringDate(fromDate: Date,havingFormat: String) -> String {

    dateFormatter.dateFormat = havingFormat
    dateFormatter.amSymbol = "AM"
    dateFormatter.pmSymbol = "PM"
    let date =  dateFormatter.string(from: fromDate)
    return  date
}

func getNumberofDays(date1: Date, date2: Date) -> Int? {
    let calendar = NSCalendar.current

    let date1 = calendar.startOfDay(for: date1)
    let date2 = calendar.startOfDay(for: date2)

    let components = calendar.dateComponents([.day], from: date1, to: date2)
    return components.day
}


来源:https://stackoverflow.com/questions/49169862/create-string-array-of-dates-from-dates-range

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!